快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X小,而右侧元素都比X大(从小到大排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。
分治法
将原有问题分解成若干个规模更小、但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合成原问题的解。
首先选择第一个数为基准,以此将当前无序的数列划分成左右两个区间,左区间的数都比基准小,而右区间的数都比基准大。
快速排序
- void QuickSort(Seqlist q, int low, int high)
- {
- int pivotpos;
- if(low<high)
- {
- pivotpos=partition( q, low, high );
- QuickSort( q, low, pivotpos-1 );
- QuickSort( q, pivotpos+1, high);
- }
- }
为排序整个文件,只须调用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]。
- int partition(int low, int high)
- {
- int tmp = array[low];
- int pivotkey = array[low];
- while (low < high)
- {
- while (low < high && array[high] >= pivotkey)
- --high;
- //array[low] = array[high];
- t=array[low]; array[low] = array[high]; array[high]=t;
- while (low < high && array[low] <= pivotkey)
- ++low;
- //array[high] = array[low];
- t=array[high]; array[high] = array[low]; array[low]=t;
- }
- //array[low] = tmp;
- return low;
- }
完整代码如下:
- #include<stdio.h>
- #define LEN 8
- int array[LEN] = {45,23,55,1,32,3,56,10};
- void outputList()
- {
- for(int i=0;i<LEN;++i)
- {
- printf("%d ",array[i]);
- }
- printf("/n");
- }
- int partition(int low, int high)
- {
- int tmp = array[low];
- int pivotkey = array[low];
- while (low < high)
- {
- while (low < high && array[high] >= pivotkey)
- --high;
- array[low] = array[high];
- while (low < high && array[low] <= pivotkey)
- ++low;
- array[high] = array[low];
- }
- array[low] = tmp;
- return low;
- }
- void qSort(int low,int high)
- {
- if (low < high)
- {
- int pivotloc = partition(low, high);
- qSort(low, pivotloc-1);
- qSort(pivotloc + 1, high);
- }
- }
- void main()
- {
- printf("The data before sort : /n");
- outputList();
- qSort(0,LEN-1);
- printf("The data after sort : /n");
- outputList();
- }