最快的排序方法,平均运行时间为O(NlogN),递归算法
左段、右段、中心位置,三种元素,利用分割法将数组中的n个值不断分割排序,每次分割都要乘2,直到分割为n份结束
程序内有详细备注
#include <stdio.h>
// 快速排序
void subSort(int arr[], int start, int end);
void quickSort(int arr[], int size)
{
// 因为要递归所以又写了个函数以便下一次调用
subSort(arr, 0, size - 1);
}
void subSort(int arr[], int start, int end)
{
// end不断的缩小直到与start相等
if (start < end)
{
int base = arr[start]; // 数组第1个数
int low = start; // 指向索引0
int high = end + 1; // 指向索引尾
while (1)
{
while (low < end && arr[++low] <= base)
; // 为了找到从前往后第1个比base大的元素,找到就停止交换位置后继续
while (high > start && arr[--high] >= base)
; // 为了找到从后往前第1个比base小的元素,找到就停止交换位置后继续
// 当low = high时第一遍分割为两段结束
if (low < high)
{
// 交换low和high位置的元素
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
else
{
// 数组分割为两段结束
break;
}
}
// 交换start与high索引的值放在数组两段之间
int temp1 = arr[start];
arr[start] = arr[high];
arr[high] = temp1;
// 递归循环
subSort(arr, start, high - 1); // 前半段
subSort(arr, high + 1, end); // 后半段
}
}
int main()
{
int arr[] = {23, 45, 2, 46, 77, 2, 99, -9, -32, 0, 66};
int size = sizeof(arr) / sizeof(int);
// 遍历
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
// 排序
quickSort(arr, size);
// 遍历
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}