快速排序,C语言实现

  排序法里比较出名的,具体的算法看下图:

这篇博客说的通俗易懂:http://blog.csdn.net/morewindows/article/details/6684558

这是快速排序的基础,用代码实现如下:

void DiviedSort(int* arr_p,int start,int end)
{
    int left,right,i=0;
    int pivot,result;
    bool flag;
    flag = TRUE;
    pivot = arr_p[start];
    right = end;
    left = start;
    #if DEBUG
    printf("pivot:%d\r\n",pivot);
    printf("L: ");
    for(i=0;i<end+1;i++){
        if(i==0)
            printf("_ ");
        else
            printf("%d ",arr_p[i]);
    }
    printf("\r\n");
    #endif
    while(left<right && flag){
        while(arr_p[right]>=pivot){
             right--;
            if(right<=left){ //右边没有找到小于pivot的数 退出总循环
                arr_p[left] = pivot; //将pivot保存到左边的坑里
                flag = FALSE;
                break;
            }
        }
        if(flag){
            //找到小于pivot的数移动到left
            arr_p[left] = arr_p[right];
            arr_p[right] = 1000;
            left++;
            if(left>=right){
                flag = FALSE;
                arr_p[right] = pivot;//当left右移等于right说明正好结束;
            }
        }else{
            #if DEBUG
            printf("Lf: ");
            for(i=0;i<end+1;i++){
                if(arr_p[i]==1000)
                    printf("_ ");
                else
                    printf("%d ",arr_p[i]);
            }
            printf("\r\n");
            #endif
            break;
        }
        #if DEBUG
        printf("R: ");
        for(i=0;i<end+1;i++){
            if(arr_p[i]==1000)
                printf("_ ");
            else
                printf("%d ",arr_p[i]);
        }
        printf("\r\n");
        #endif
        while(arr_p[left]<=pivot){
            left++;
            if(left>=right){//左边没有找到大于pivot的数退出总循环
                arr_p[right] = pivot;//保存pivot到右边的坑里
                flag = FALSE;
                break;
            }
        }
        if(flag){
            //找到大于pivot的数移动到right
            arr_p[right] = arr_p[left];
            arr_p[left] = 1000;
            right--;
            if(right<=left){
                flag = FALSE;
                arr_p[left] = pivot;//当right左移等于left说明正好结束
            }
        }else{
            #if DEBUG
            printf("Rf: ");
            for(i=0;i<end+1;i++){
                if(arr_p[i]==1000)
                    printf("_ ");
                else
                    printf("%d ",arr_p[i]);
            }
            printf("\r\n");
            #endif
            break;
        }
        #if DEBUG
        printf("L: ");
        for(i=0;i<end+1;i++){
            if(arr_p[i]==1000)
                printf("_ ");
            else
                printf("%d ",arr_p[i]);
        }
        printf("\r\n");
        #endif
    }
}

运行结果是:

这个例子比较特殊。一轮就得出结果了,但是实际上要对pivot左右两边都分别递归调用这个算法,才能得到从小到大的顺序。

这里递归判断的条件是:

Left<Right

左边下标大于或者等于右边下标的时候说明数字已经按照从小到大排列。

下面是快速排序的完整代码。

//快速排序
//left:数组的起始位
//right:数组的结束位置,注意不是数组的最大容量
void QuickSort(int * arr,int left,int right)
{
    int pivotNum = 0;
    int start,end;
    if(left<right){
        start = left,end = right;
        pivotNum = arr[start];
        while(start<end){
            //从右边找一个小于pivotNum的数
            while(start<end && arr[end]>=pivotNum){
                end--;//右边的游标左移
            }
            if(start<end){
                arr[start++] = arr[end];
            }
            //从左边找一个大于pivotNum的数
            while(start<end && arr[start]<=pivotNum){
                start++;//左边的游标右移
            }
            if(start<end){
                arr[end--] = arr[start];
            }
        }
        arr[start] = pivotNum;//这里在得出按照pivotNum比较得出顺序之后,要把中间数保存到最后游标停下的位置
        QuickSort(arr,left,start-1);
        QuickSort(arr,start+1,right);
    }
}

验证代码:

int main(int argc, char *argv[]) {
    int i=0;
    int arr[11] = {6,2,3,9,1,2,7,41,4,1,0};
    QuickSort(arr,0,10);
    for(i=0;i<11;i++){
        printf("%d ",arr[i]);
    }
    printf("\r\n");
    system("pause");
    return 0;
}

运行结果:

最后对于pivotNum中间值的选择可以随机选择也可以去中间值。

快速排序的效率问题:

如果每次确定的中值都是最小或者最大,那么时间复杂度是O(N^2);

最好的情况是中值正好是中间值,那么时间复杂度是O(nlgN);

总结:就平均效率而言,快速排序是基于关键之比较的速度最快的,平均效率是O(nlgN);

时间: 2024-10-13 04:39:07

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

排序(5)---------快速排序(C语言实现)

继shell发明了shell排序过后呢,各位计算机界的大牛们又开始不爽了,为什么他能发明,我就不能发明呢.于是又有个哥们蹦出来了.哎...那么多排序,就木有一个排序是中国人发明的.顺便吐槽一下,一百年的天朝的历史书里还在吹,祖冲之第一个发现圆周率,领先世界一千多年...... 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 步骤为: 1,从数列中挑出一个元素,称为 "基准", 2,重新排序数列,所有元素比基准

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i

快速排序&gt;&gt;&gt;&gt;C语言实现

#include <stdio.h> #include <stdlib.h> #include <string.h> void swap(int *p1, int *p2) { int tmp = 0; tmp = *p1; *p1 = *p2; *p2 = tmp; } void quick_sort(int arr[], int len) { int i = 0; int j = 0; for (i = 0; i < len; i++) { for (j =

快速排序(C语言)

非递归: #include <stdio.h> #include <stdlib.h> int partition(int s[], int i, int j) { int value = 0; int flag = 1; //判断该从头循环还是尾循环 value = s[i]; while(i<j) { switch(flag) { case 0: if(s[i] < value) i++; else { s[j--] = s[i]; flag = 1; } brea

插入排序/希尔排序/快速排序C语言实现

#include<stdio.h> #include<stdlib.h> #include<string.h> void swap(int *a,int *b) { int tmp=*a; *a=*b; *b=tmp; } void insertSort(int *a,int n) { int tmp,i,j; for(i=1;i<n;i++) { tmp=a[i]; for(j=i;j>0&&tmp<a[j-1];j--)//find

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

qsort快排c语言和c++应用

C语言中用qsort()快速排序 C语言中排序的算法有很多种,系统也提供了一个函数qsort()可以实现快速排序.原型如下: void qsort(void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *)); 它根据comp所指向的函数所提供的顺序对base所指向的数组进行排序,nmem为参加排序的元素个数,size为每个元素所占的字节数.例如要对元素进行升序排列,则定义comp所指向的函数为:如果

快速排序(Quick Sort)的C语言实现

快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤为 设立枢轴,将比枢轴小的记录移到低端,比枢轴大的记录移到高端,直到low=high停止 分别对枢轴低高端部分再次快速排序(即重复第1步) 重复第1.2步,直到low=high停止 C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章,转载请注明来自钢铁侠Mac博客http:/

c语言最基础的冒泡排序和快速排序

学C语言刚学到数组,学到数组排序必不可少,这只是两种最基础的排序方法 以下排序是根据数字的从大到小排序 冒泡排序 快速排序

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.