快排C语言实现

快速排序也是典型的分治策略实现,与归并排序不同,快排的关键部分在于 分 也就是partition部分,快排平均时间复杂度是O(nlgn),最差时间是O(n^2),属于不稳定排序

下面是快排的C语言实现。

//p, r分别是数组中元素的下标
int partition(int A[], int p, int r)
{
    int i, j;
    i = p - 1;

    for(j = p; j < r; j++) {
        if (A[j] <= A[r]) {
            swap(&A[++i], &A[j]);
        }
    }
    //i总是最后一个满足小于等于A[r]的元素
    swap(&A[i + 1], &A[r]);
    return i + 1;
}

void quicksort(int A[], int p, int r)
{
    if (p < r) {
        int q = partition(A, p, r);
        quicksort(A, p, q - 1);
        quicksort(A, q + 1, r);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 00:40:55

快排C语言实现的相关文章

快排 快速排序 qsort quicksort C语言

现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. 1 #include<stdio.h> 2 #define MAXN 10000 3 int a[MAXN]; 4 int n; 5 void Mysort(int l, int r) { 6 int x,y,mid,t; 7 mid = a[(l+r)/2]; 8 x=l; 9 y=r; 10 do { 11 while(a[x]<mid

霍尔快排的C语言实现

专题的前一篇讲了快速排序的始祖——霍尔快排,那么这里就简单地实现一下霍尔快排. 补充说明下,快排的一个核心步骤是选取枢纽元,通常的做法是将第一个元素用作枢纽元,<算法导论>里的快排例子和Hoare快排都是这种枢纽元选择.先撇开效率不说,我们先看看Hoare快排的实现:香格里拉娱乐城 01 #include "stdio.h" 02 #include "math.h" 03 #include "stdlib.h" 04   05 int

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =

快速排序—三路快排 vs 双基准

快速排序被公认为是本世纪最重要的算法之一,这已经不是什么新闻了.对很多语言来说是实际系统排序,包括在Java中的Arrays.sort. 那么快速排序有什么新进展呢? 好吧,就像我刚才提到的那样(Java 7发布两年后)快速排序实现的Arrays.sort被双基准(dual-pivot)排序的一种变体取代了.这篇文章不仅展示了为什么这个变化如此优秀,而且让我们看到Jon Bentley和Joshua Bloch的谦逊. 我当时做了什么? 与所有人一样,我想实现这个算法并且对一千万个数值排序(随机

poj 2804 词典 (字典树 或者 快排+二分)

2804:词典 总时间限制:  3000ms  内存限制:  65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输入中出现单词只

gogo闯SEO快排教程及应用编程(同步官方)

https://www.zygx8.com/thread-11604-1-1.html 授课内容简介: 两个模块:「SEO套路」和「SEO应用编程」 「SEO套路」模块,分 "域名.内容&模板.关键词.链接.点击" 五个章节,所有的SEO动作都是从这5个点中入手 多一些思路和实战,即:经过分析,出于前提条件X(思路),对网站做Y这个动作(实战),可以大概率提升排名&流量.其中实战部分,大站和灰色站的套路居多 「SEO应用编程」模块,分"基础.SEO数据分析.快

验证元素的唯一性(二重循环法和快排优化)

学校练习,简单的我就不放上来了,值得整理的,我保存一下 习题4 1.1.验证元素唯一性(二重循环)   1.1.1.算法描述 验证元素唯一性,主要方法是:建立两重循环,进行校验每个元素和其他元素的 1.1.2.伪代码   UniqueElements(A[0..m-1]) //验证给定数组中的元素是否唯一 //输入:数组A[0..n-1] //输出:如果A中元素全部唯一,返回true //否则返回false for i<- 0 to n-2 do for j<- i+1 to n-1 do i

算法学习——单链表快排

/**  * 以p为轴对start-end间的节点进行快排(包括start && 不包括end):  * 思路:  * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面:  * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点:  * 3.递归的遍历2中两部分节点.  *   * @param p  * @param start  * @para

快排的递归和非递归

常用的快排都是用递归写的,因为比较简单,但是可以用栈来实现非递归的快排. 第一种是递归的快排 #include<stdio.h> #include <stdlib.h> #include <time.h> int quick(int a[],int i ,int j) {     int tmp=0,key,b=0;     int im,jm;     im=i;     jm=j;     key=a[i];     if(i>j)         retur