正常的选择、冒泡排序,时间复杂度为O(nn)
快速排序 平均为:O(n×log(n)) 最坏:O(nn)
就是将数组按照 其中的一个元素(基准值)进行分割,分割为两个部分:大于基准值和小于基准值
因为此时第一次排完序只是将数组分割,而被分割的部分并不一定是从小到大排序,所以需要下一次的对两个分割部分在进行各自的 找基准值+分割 。。。成为一个递归的过程
而递归的出口就是基准值下标的 左下标 >= 右下标
#include <stdio.h>
void quickSort(int* array, int left, int right);
int partsort(int* array, int left, int right);
int main()
{
int i, array[100];
int n;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &array[i]);
}
quickSort(array, 0, n - 1);
for (i = 0; i < n; i++) {
printf("%d ", array[i]);
}
return 0;
}
void quickSort(int* array, int left, int right)
{
//递归出口
if (left >= right) {
return;
}
//返回基准值的位置 ,也就是此次的中点位置
int Index = partsort(array, left, right);
//重新将数组分为两段,通过递归调用将两部分进行进一步的排序
//左半部分
quickSort(array, left, Index - 1);
//右半部分
quickSort(array, Index + 1, right);
}
int partsort(int* array, int left, int right)
{
//找到基准值
int point = array[left];
//记录此时基准值的位置
int temp = left;
//通过两个while相互对 左值与右值的覆盖,从而实现 把数组从基准值分为 两部分
while (left < right) {
while (left < right) {
/*如果最右边元素的值 小于 此时的基准值,那么就将此时右边元素的值 复制 给开始的基准位置
而此时就会出现两次右边元素的值,需要消掉 本体 的元素,而用其他元素替代*/
if (array[right] < point) {
array[left] = array[right];
left++; //此时左边元素的值被 赋值为 比基准值小的元素值, 满足了小于基准值的条件,就寻找下一个
temp = right;
break; //一左一右的找
} else {
right--; //直到找到比基准值小的右半部分元素
}
}
while (left < right) {
/*如果左边的值 大于 基准值,就得把他往后移,移到上上面找到的 右边元素小于基准值的位置,
将这个本体覆盖为此时的 大于基准值的元素,而此时就是把左值 复制了一边,要把他的本体消掉*/
if (array[left] > point) {
array[right] = array[left];
right--;
temp = left;
break;
} else {
left++; //直到找到比基准值大的左半部分元素
}
}
}
//最后退出循环的条件为left > right,那么这个left后者right就是最后被 复制 的元素;
array[temp] = point; //最后将 最后一个复制的元素 赋值为 一开始的point。
return temp; //返回此次的中点位置
}