1.快速排序的思想
给第一个元素找到在数组中的位置,这个位置就是这个元素最终在数组中的位置,然后给这个元素左右两侧进行递归排序。
2.代码
#include <stdio.h> void Qsort(int a[], int low, int high) { if(low >= high) return; int first = low; int last = high; int key = a[first]; while(first < last){ while(first < last && a[last] >= key) --last; a[first] = a[last]; while(first < last && a[first] <= key) ++first; a[last] = a[first]; } a[first] = key; Qsort(a, low, first-1); Qsort(a, first+1, high); } int main() { int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24}; Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1); for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) printf("%d\n", a[i]); return 0; }
代码说明:
[1]把第一个值作为key,并保存下来,此时数组第一个位置就空出来了。
[2]之后进入循环,每个循环:首先从后往前找,找到小于key的,放到空出的位置,此时当前的位置就空出来了。然后从前往后找,找到大于key的,则放到空出的位置,此时当前的位置就空出来了。
[3]把key放到当前空出的位置,这个位置就是key最终在数组的位置。
[4]递归排序key左右两侧数组。
总结:
整个思想就是留一个空位置(第一个位置),之后从前往后,从后往前跟key比较之后,移动值到这个空位置,最后first>=last时,此时,空位置的左侧都小于key,而右侧都大于key,所以把key放到当前的空位置。