快速排序算法
qsort
函数底层思想为快速排序(quick sort)
1.快速排序的思想:
从数列中挑出一个元素,称为 “基准”,“枢轴”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
1.实现代码(有详细注释)
//每次交换均为枢轴与待交换值得交换,最终枢轴处于它应在得位置
void Swap(int* base, int low, int high)
{
int tmp = base[low];
base[low] = base[high];
base[high] = tmp;
}
//第一次进入时,首元素为枢轴,比其小的放左边,比其大的放右边,得到首个元素应处的位置
int get_point(int* base, int low, int high)
{
int pivot = base[low];
while (low < high)
{
while (low < high && base[high] > pivot)//跳过本就大于枢轴,不需调动的元素
{
high--;
}
Swap(base, low, high);//将小于枢轴的的元素调至左侧
//注意:每次交换的中间数均为定义的枢轴
while (low < high && base[low] < pivot)//跳过本就小于枢轴,不需调动的元素
{
low++;
}
Swap(base, low, high);//将大于枢轴的的元素调至右侧
}
return low;
}
//快排函数
void quick_sort(int* base, int low, int high)
{
if (low < high)
{
//找到每次快排范围内枢轴应处的位置,根据其位置将排查域进行分割
//对每块子区域进行相同操作,以此递归
//得到初始low位置元素应处的位置
int point = get_point(base, low, high);
// 对point之前元素进行快速排序
quick_sort(base, low, point - 1);
//对point之后元素进行快速排序
quick_sort(base, point + 1, high);
}
}
int main()
{
int i;
int arr[] = { 5,13,6,24,2,8,19,27,6,12,1,17 };
int sz = sizeof(arr) / sizeof(arr[0]);
quicksort(arr, 0, sz-1);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}