快速排序
哔哩哔哩 https://www.bilibili.com/video/BV1Tt411r75A?from=search&seid=8963086176545103840
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
- 1.先从数列中取出一个数作为基准数。(通常为数列第一个值)
- 2.分区过程,大于这个数大的全放到它的右边,小于它的数全放到它的左边。
- (相等的不用排序交换,因为小和大的值都已经排好的话就自然剩下的相等数值在一排,如果交换相等的会导致算法错误)
- 3.再对左右区间重复第二步,直到各区间只有一个数。
用白话概况则 在一次排序的中,我们选取第一个点为数组中心点,
1.这时我们需要找到数组中心点的索引值的同时
2.并将所有值和中心值对比,将比中心值大的放在右边,小于它的数全放到它的左边。左右区域不需要排序
3.除了中心点以外的左右区域回到第一步进行下一次排序
19 97 9 17 1 8
L R
递归实现:
/* 从小到大排序 递归 */
void quickSort(int *arr, int L, int R)
{
/* 退出条件: 数组只有一个值时则被当做已经排序好的最新序列 */
if (L >= R) {
return;
}
int left = L;
int right = R;
/* 将数组最左侧值作为中心轴值,保存起来,下面将寻找中心轴的位置
数组的最左侧的可以当做数组第一个需要填值的开始
1.将比basic小的值,放在数组左侧
2.将比basic大的值,放在数组右侧
*/
int basic = arr[L];
while (left < right) {
/* 在右侧 找到比basic小的数 */
while (left < right && basic <= arr[right]) {
right--;
}
/* 将比basic小的值,放在数组左侧 ,注意,如果left == right 时,会跳到末尾(最后有left == right的判断) */
if (left < right) {
arr[left] = arr[right];
}
/* 在左侧 找到比basic大的数 */
while (left < right && basic >= arr[left]) {
left++;
}
/* 将比basic大的值,放在数组右侧 ,注意,如果left == right 时,会跳到末尾(最后有left == right的判断) */
if (left < right) {
arr[left] = arr[right];
}
/* 当left == right,说明 已到达中心轴位置,就是basic值坐标,此次排序结束 */
if (left >= right) {
arr[left] = basic;
}
}
/* right坐标已经不需要再排序*/
/* 数组的左边区域排序 */
quickSort(arr, L, right - 1);
/* 数组的右边区域排序 */
quickSort(arr, left + 1, R);
}
int main(int argc, const char *argv[])
{
int a[8] = {1, 3, 6, 8, 8, 9, 7, 8};
quickSort(a, 0, 7);
for (int i = 0; i < 8; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
快速排序因排序效率高常被采用,在软件公司笔试面试及程序考试中常见。它由C.R.A.Hoare于1962年提出,采用分治策略。基本思想是先取基准数,分区使大于它的放右边、小于它的放左边,再对左右区间重复操作,直至各区间只有一个数。
18万+

被折叠的 条评论
为什么被折叠?



