本人是一名在在校的大一新生 不想暑假摆烂 希望大佬们多多关照 我会虚心学习
快速排序
定义:
快速排序是 H o a r e HoareHoare 于1962年提出的一种二叉树结构的交换排序方法,
基本思想
:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复 该过程,直到所有元素都排列在相应位置上为止。
图解分析:
首先设置三个参数,start指向区间最左端,end指向区间最右端,key为当前的分界值。下标为pivot
从待排序的数据元素中选取一个通常为第一个作为基准值元素(pivot)key=array[0],设置双指针start指向区间左端,end指向区间右端。
第一步:一开始坑在左边 要向右边找不大于6 然后将值添到坑位里 该值的位置为新的坑位
第二步 坑位在右边 向左边找比大于等于6的数 该值添到坑位里 该值的位置为新的坑位
第三步以此类推循环往复 直到将数组分成
如果我们可以将左区间变成有序的 右区间变成有序的 那么整体就是有序了 这是类似于分治算法的
我门可以将左右区间分成子区间进行排序 这样我们就解决了这个问题
下面是图片直观解释
时空复杂度
快速排序之所以比较快 是因为每次的交换时跳跃式的,每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。
它的平均时间复杂度为O ( n log 2 n )
代码附录
#include<stdio.h>
void Quicksort(int* arr,int left,int right)
{
if (left>=right)
{
return;
}
int begin = left,end = right;
int pivot = begin;
int key = arr[pivot];
while (begin<end)
{
//右边的找小 放到左边坑位
while (begin < end && arr[end] >= key)
{
--end;
}
arr[pivot] = arr[end];
pivot = end;
//左边的找大 放到右边坑位
while (begin < end && arr[begin] <= key)
{
++begin;
}
arr[pivot] = arr[begin];
pivot = begin;
}
pivot = end;
arr[pivot] = key;
//[left right]
//[left pivot-1] 6 [pivot +1 ,righrt]
Quicksort(arr, left, pivot - 1);
Quicksort(arr, pivot + 1, right);
}
int main()
{
int array[] = { 6,5,7,1,4,9,6 };
Quicksort(array, 0 ,sizeof(array) / sizeof(array[0])-1);
for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
}
总结:快速排序的问题可以看成指针问题+分治问题。
文章若有错误 虚心改正