其实就是个挖坑填坑的过程
把第一个元素作为基准值,放在临时变量里,头尾各有一个索引,从后面遍历找到比这个临时变量小的元素,找不到就索引前移,找到了放在前面的坑里,这时坑就变成了后面的索引所在位置
再从前面索引找比临时变量大的元素,过程相同
不断重复上述两个过程(前面有坑找后面,后面有坑找前面)直至前后两个索引重合,这时坑就是两个索引重合的地方,临时变量放入坑中,一次循环完成
这时索引前面的元素全是比索引元素小的元素,之后全是比索引大的元素,下标分别为 0到i-1 和 i+1到max
索引前后元素分别递归执行此次过程,排序完成
#include <stdio.h> void quickSort(int *arr ,int low,int high){ //入口 if(low<high){ int temp=arr[low]; int i=low; int j=high; while (i<j){ //从右边开始找小的元素 while (temp<arr[j]&&i<j){ j--; } //填坑后移,后面多了个坑 基准值无需改变 if(i<j){ arr[i]=arr[j]; i++; } //前面没坑了,后面有坑,从前面找 while (arr[i]<temp&&i<j){ i++; } if(i<j){ arr[j]=arr[i]; j--; } arr[i]=temp; quickSort(arr,low,i-1); quickSort(arr,i+1,high); } } } int main() { int a[] ={3,24,.218,1,7,78,9,78,4,24,24,2,4}; for (int i = 0; i < sizeof(a)/ sizeof(int); ++i) { printf("%d ",a[i]); } printf("\n"); quickSort(a,0, sizeof(a)/ sizeof(int)); for (int i = 0; i < sizeof(a)/ sizeof(int); ++i) { printf("%d ",a[i]); } return 0; }