c语言实现快速排序

来源:互联网 发布:mac怎么卸载第三方软件 编辑:程序博客网 时间:2024/06/07 18:09

快速排序
时间复杂度:最好时间O(nlogn) 最坏时间O(n^2)
稳定性:不稳定 快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现方法:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,
所有比它大的数都放到它后面,这个过程称为一趟快速排序。

//代码实现: #include <stdio.h>  #include <stdlib.h> //实现交换  void Swap(int a[] ,int low ,int high)   {      int tmp;    tmp=a[low];    a[low]=a[high];     a[high]=tmp;  }   /**************************************************************************   函数名:partition()                                                功能: 计算基准点的函数,并将小于基准点的元素放于基准点的左边,大于基准点的数放于基准点右边                                           输入参数: int a[]:待排序的数组                                        int low:数组的起始位置                                     int high:数组的结束位置                     返回值:int 基准点                                    ***************************************************************************     */  int partition(int a[],int low,int high)     {     int point;      //基准点定位为第一个元素       point=a[low];       while( low < high)     {    //将大于基准点的数放于基准点的右边      while( low < high && a[high] >= point )          high--; //移到前一个元素      //当不满足大于基准点,交换基准点       Swap(a,low,high);   //将小于基准点的数放于基准点的左边      while( low < high && a[low] <= point)          low++; //移到下一个元素     //当不满足小于基准点,交换基准点        Swap(a,low,high);    }     return low;//返回的中间点,当退出循环后low 与high指向同一个元素    }    //low 为数组起始位置 high为数组的结束位置void QSort(int a[],int low,int high)    {     int point;//定义变量存放基准点       if( low < high )    {        point=partition(a,low,high);//对基准点定位        //对基准点左边进行递归调用      QSort(a,low,point-1);       //对基准点右边进行递归调用   QSort(a,point+1,high);    }  }   //外层函数,由于快速排序需要三个参数,为零满足只要两个参数,定义一个外层函数调用实际操作的函数    void QuickSort(int a[],int len)     {     //调用实际操作的函数     QSort(int a[],0,len-1);   }   int main(int argc, char const *argv[])  {      int array[]={123,456,12,3,456};     QuickSort(array,5);     int i;     for(i=0;i<5;i++)    {         printf("%d ",array[i]);       }       return 0;     }
0 0