#include <stdio.h>
/* 快排:快速排序
基本思想:通过比较关键词、交换纪录,以某个记录为界(也称为支点),将待排序列氛围2个部分。一部分所有记录的关键字大于等于支点纪录的关键字,另一部分所有记录的关键词小于支点纪录的关键字。将待排序列按照关键字以支点纪录分成两部分的过程,成为一次划分,对各部分不断划分,直到整个序列按照关键字有序。
记忆:不稳定的排序方法,时间复杂度O(nlogn),空间复杂度O(logn)=二叉排序的高度
*/
void QuickSort(int array[],int low,int high) // 0 ~ n-1
{
// 以某个支点将待排序列分为2个部分
int i,j,index;
if (low >= high) return; //递归终止条件
i = low; //定义2个搜索指针
j = high;
index = array[i]; //选取index
while (i < j) {
while (i < j && array[j] >= index) // 大于等于index,那么继续前移
j--;
if (i < j) // 直到小于index,赋值到前面
array[i] = array[j];
while (i < j && array[i] < index) // 小于index,那么继续后移
i++;
if (i < j) // 直到大于等于index,赋值到后面
array[j] = array[i];
}
array[i] = index; //将index填到空位
// 递归左半部分和右半部分(对个部分不断划分直到有序)
QuickSort(array, low, i-1);
QuickSort(array, i+1, high);
}
int main(int argc,const char * argv[])
{
int i =0;
int a[] = {5,4,9,8,2,6,0,1,3,2 ,9 ,32,3,100,32,2};
int len =sizeof(a)/sizeof(a[0]);
QuickSort(a,0, len - 1);
for (i =0; i < len; i++) {
printf("%d ",a[i]);
}
printf("\n");
return0;
}