前言
快速排序定义:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一、快速排序原理
快速排序说到底就是 选择一个base, 然后通过一顿瞎操作, 使得 当前数组变成 左小,base, 右大(小,大,都是相对于base 来说的)然后使用同样的方法将 上一步的左小排成 左小,base, 右大的格式, 将上一步的右大也排成 左小,base, 右大的格式, 这样不断的进行,最终变成了一个有序的数组
二、快速排序步骤
1.操作原理
- 先从序列找到一个基准元素,一般选择第一个或者最后一个,对应的操作是不一样的
- 扫描数列,将比基准数小的元素放在它的左面,比基准数大的,放在它的右面,得到左右两个区间
- 再对左右两个区间执行第二步
快速排序的口诀; 快速排序的口诀,一选底, 二动指针分先后, 左基底右先行, 右基底左先行,指针相遇换基底,问题化小转递归,终止条件0,1 (个)数
2.操作步骤
第一步:先操作右指针,当遇到比44小时,停止指针,然后把指针的当前值放到坑里(此时的坑是第一个元素的位置)
第二步:操作左指针,挡遇到比44大时,把当前指针的值放到右指针指向的位置,再次移动右指针
第三部,依次操作,知道左右指针指向同一个位置,第一次结束
三,代码实现
void sort(int *data, int left, int right) {
if (left >= right) return ;
int i = left;
int j = right;
int key = data[left];
while (i < j) {
while (i < j && key <= data[j]) {
j --;
}
data[i] = data[j];
while (i < j && key >= data[i]) {
i ++;
}
data[j] = data[i];
}
data[i] = key;
sort(data, left, i - 1);
sort(data, i + 1, right);
}
int quick_sort(int *data, int length) {
sort(data, 0, length-1);
}
参考:
1:https://www.bilibili.com/video/BV1Ur4y1w7tv?p=13&t=51