递归法实现快速排序
练习了一下快速排序算法,请各位大佬指教~~~
***快速排序思想:***在待排序的序列中选取一个元素作为枢纽元素,以此枢纽元素为基准,将整个待排序列 进行划分,小于枢纽元素的放到序列左边,大于枢纽元素的放到序列右边。然后分别对枢纽元素左边的序列和右边的序列进行快速排序。
***时间复杂度:***一次划分的时间复杂度为O(n),理想情况下,整个快速排序的时间复杂度为O(nlogn),最坏情况下为O(n^2)。
***稳定性:***快速排序不是一种稳定的排序算法
/*
***作者:Bruce Yuu
***用途:工具函数,用于两个数之间交换
***参数:两个整型指针
***日期:2021/3/16
*/
void swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
/*
***作者:Bruce Yuu
***用途:工具函数,利用三数取中值法取快速排序时需要用到的枢纽元素
***参数:待排序的数组,数组起始下标,数组结束下标
***日期:2021/3/16
*/
int Median3(int Arr[], int Left, int Right) {
int Mid = (Left + Right) / 2;
if (Arr[Left] > Arr[Mid])
swap(&Arr[Left], &Arr[Mid]);
if (Arr[Left] > Arr[Right])
swap(&Arr[Left], &Arr[Right]);
if (Arr[Mid] > Arr[Right])
swap(&Arr[Mid], &Arr[Right]);
swap(&Arr[Mid], &Arr[Right]);//将枢纽元素放到数组最后一个位置
return Arr[Right];
}
/*
***作者:Bruce Yuu
***用途:递归法实现快速排序
***参数:待排序的数组,数组起始下标,数组结束下标
***日期:2021/3/16
*/
void quick_sort_recursive(int Arr[], int Start, int End) {
int Left = Start;
int Right = End - 1;
int Count1, Count2;
if (Left + 3 < End)
{
int pivot = Median3(Arr, Start, End);//枢纽元素
while (Arr[Left] < pivot && Left < Right)
Left++;
while (Arr[Right] > pivot && Left < Right)
Right--;
if (Left < Right) {
swap(&Arr[Left], &Arr[Right]);
}
swap(&Arr[Left], &Arr[End]);//枢纽元素归位
quick_sort_recursive(Arr, Start, Left - 1);
quick_sort_recursive(Arr, Left + 1, End);
}
else {//如果数组元素个数小于等于3时单独处理,此处采用冒泡排序法
for (Count1 = 0; Count1 < End; Count1++) {
for (Count2 = 0; Count2 <= End - Count1 - 1; Count2++) {
if (Arr[Count2] > Arr[Count2 + 1])
swap(&Arr[Count2], &Arr[Count2 + 1]);
}
}
}
}
/*
***作者:Bruce Yuu
***用途:快速排序
***参数:待排序的数组,数组长度
***日期:2021/3/16
*/
void quick_sort(int Arr[], int Len) {
quick_sort_recursive(Arr, 0, Len - 1);
}