王道数据结构 (18) 快速排序
转发:
http://c.biancheng.net/cpp/html/2741.html
#include <stdio.h> #include <stdlib.h> #define N 6 int partition(int arr[], int low, int high){ int key; key = arr[low]; while(low<high){ while(low <high && arr[high]>= key ) high--; if(low<high) arr[low++] = arr[high]; while( low<high && arr[low]<=key ) low++; if(low<high) arr[high--] = arr[low]; } arr[low] = key; return low; } void quick_sort(int arr[], int start, int end){ int pos; if (start<end){ pos = partition(arr, start, end); quick_sort(arr,start,pos-1); quick_sort(arr,pos+1,end); } return; } int main(void){ int i; int arr[N]={32,12,7, 78, 23,45}; printf("排序前 \n"); for(i=0;i<N;i++) printf("%d\t",arr[i]); quick_sort(arr,0,N-1); printf("\n 排序后 \n"); for(i=0; i<N; i++) printf("%d\t", arr[i]); printf ("\n"); system("pause"); return 0; }
运行结果:
排序前 32 12 7 78 23 45 排序后 7 12 23 32 45 78
在上面的代码中,根据前面介绍的步骤一步步实现了快速排序算法。接下来通过示意图来演示第一次划分操作。
在第一次划分操作中,先进行初始设置,key的值是进行划分的基准,其值为要划分数 组的第一个元素值,在上面的排序序列中为第一个元素值32,同时将low设置为要排序数组中第一个元素的下标,第一次排序操作时其值为0,将high设置为要排序序列最后一个 元素的下标,在上面的排序序列中其第一次取值为5。先将下标为high的数组元素与key进行比较,由于该元素值大于key,因此high向左移动一个位置继续扫描。由于接下来的值为 23,小于key的值,因此将23赋值给下标为low所指向的数组元素。接下来将low右移一 个位置,将low所指向的数组元素的值与key进行比较,由干接下来的12、7都小于key, 因此low继续右移扫描,直至下标low所指向的数组元素的值为78即大于key为止,将78赋值给下标为high所指向的数组元素,同时将high左移一个位置。接下来由于low不再小于high,划分结束。需要注意的是,在进行划分的过程中,都是将扫描的值与key的值进行对比,如果小于key,那么将该值赋值给数组中的另外一个元素,而该元素的值并没有改变。 从图中可以看出这一点,所以需要在划分的最后将作为划分基准的key值赋值给下标为 pos的数组元素,这个元素不再参与接下来的划分操作。
第一次划分操作
第一轮划分结束后,得到了左右两部分序列A[0]、A[1]、A[2]和A[4]、A[5],继续进 行划分,即对毎轮划分后得到的两部分序列继续划分,直至得到有序序列为止。
越努力越幸运