快速排序Qsort--C语言版

来源:互联网 发布:linux more指令 编辑:程序博客网 时间:2024/05/22 09:47

快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X小,而右侧元素都比X大(从小到大排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。

 

分治法

将原有问题分解成若干个规模更小、但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合成原问题的解。

 

首先选择第一个数为基准,以此将当前无序的数列划分成左右两个区间,左区间的数都比基准小,而右区间的数都比基准大。

 

快速排序

  1. void QuickSort(Seqlist q, int low, int high)
  2. {
  3.         int pivotpos;
  4.         if(low<high)
  5.         {
  6.             pivotpos=partition( q, low, high );
  7.             QuickSort( q, low, pivotpos-1 );
  8.             QuickSort( q, pivotpos+1, high);
  9.         }
  10. }

为排序整个文件,只须调用QuickSort( q, 1, n )即可完成对整个数组的排序。

 

那么如何来确定基准呢,这需要由partition( )函数来完成。

1、设置两个指针low和high,初值为区间的下界和上界。选取数组的第一个数为基准(pivotpos),即pivotpos=array[low], low=0.

2、首先从右向左比较,如果比基准小,则将较小的数交换到基准所在的位子上,否则继续向左搜寻--high;

3、发生交换后,再从左向右比较,如果比基准大,则将较大的数交换到基准所在的位子上,否则继续向右搜寻++low.

4、重复第3、第4部,直到low>=high。然后将基准的值赋给array[low]。

 

 

  1. int partition(int low, int high) 
  2. {
  3.     int tmp = array[low];
  4.     int pivotkey = array[low];
  5.     while (low < high) 
  6.     {
  7.         while (low < high && array[high] >= pivotkey) 
  8.             --high;
  9.         //array[low] = array[high];   
  10.         t=array[low]; array[low] = array[high]; array[high]=t;
  11.         while (low < high && array[low] <= pivotkey) 
  12.             ++low;
  13.         //array[high] = array[low];
  14.         t=array[high]; array[high] = array[low]; array[low]=t;
  15.     }
  16.     //array[low] = tmp;
  17.     return low;
  18. }

完整代码如下:

  1. #include<stdio.h>
  2. #define LEN 8
  3. int array[LEN] = {45,23,55,1,32,3,56,10};
  4. void outputList()
  5.     for(int i=0;i<LEN;++i)
  6.     {
  7.         printf("%d ",array[i]);
  8.     }
  9.     printf("/n");
  10. }
  11. int partition(int low, int high) 
  12. {
  13.     int tmp = array[low];
  14.     int pivotkey = array[low];
  15.     while (low < high) 
  16.     {
  17.         while (low < high && array[high] >= pivotkey) 
  18.             --high;
  19.         array[low] = array[high];
  20.         while (low < high && array[low] <= pivotkey) 
  21.             ++low;
  22.         array[high] = array[low];
  23.     }
  24.     array[low] = tmp;
  25.     return low;
  26. }
  27. void qSort(int low,int high)
  28. {
  29.     if (low < high) 
  30.     {
  31.         int pivotloc = partition(low, high);
  32.         qSort(low, pivotloc-1);
  33.         qSort(pivotloc + 1, high);
  34.     }    
  35. }
  36. void main()
  37. {
  38.     printf("The data before sort : /n");
  39.     outputList();
  40.     qSort(0,LEN-1);
  41.     printf("The data after sort : /n");
  42.     outputList();
  43. }

 

 

 

 

 

原创粉丝点击