首页 > 快速排序的实现与注意点

快速排序的实现与注意点

先上实现了的C++代码:

 1 #include  
 2 #include  
 3 #include  
 4 #include  
 5 using namespace std;
 6 const int maxn = 100;
 7 int a[maxn], n;
 8 void quick_sort(int left, int right) {
 9     if(left > right) {
10         return;
11     }
12     int i = left, j = right, key = a[left];
13     while(i != j) {
14         while(i < j && a[j] >= key) {
15             j--;
16         }
17         //寻找分界点右边比key小的数
18         while(i < j && a[i] <= key) {
19             i++;
20         }
21         //寻找分界点左边比key大的数
22         if(i != j) {
23             swap(a[i], a[j]);
24         }
25         //如果找到了,则交换
26     }
27     swap(a[left], a[i]);
28     //将key放到分界点的位置上,之后进行递归处理分界点两侧的数据
29     quick_sort(left, i - 1);
30     quick_sort(i + 1, right);
31 }
32 int main() {
33     scanf("%d", &n);
34     srand((unsigned)time(NULL));
35     for(int i = 0; i < n; i++) {
36         a[i] = rand() % 1000;
37     }
38     quick_sort(0, n - 1);
39     for(int i = 0; i < n; i++) {
40         printf("%d ", a[i]);
41     }
42     printf("
");
43     return 0;
44 }

 

下边说说两个注意点:

(1)关于quick_sort函数第一句,为什么要判断left是否大于right?

考虑这样一组输入数据:

10

279 786 373 946 460 552 698 754 519 759

这组数据就是为什么要有if(left > right)的原因,因为第一轮下来以后,i、j均为0(279比其他所有数都小),之后递归处理的时候,左边的区间为(0, -1),不合法!

(2)为什么每一轮查找左右两部分的时候,都要从右端开始(下标j)?

每一轮两边找的时候,都从右边开始的原因是为了保证最终a[i]和a[left]交换的时候,a[i]>=a[left]

比如考虑这样一组数据:

6

7 1 2 3 4 8

这样如果从左边先找,第一轮下来后,将会使得i为5,交换a[0]和a[5],左边区间为0-4,右边没有,但是左边区间有一个8,比7大!

转载于:https://www.cnblogs.com/wannafly1995/p/8074187.html

更多相关:

  • 2. Stochastic Finite Horizon Problem 在这一节中主要介绍了随机DP算法来解决不确定性下的有限地范围问题,如Denition 1.4所述,它被表述为一个组合优化问题。众所周知,由于组合爆炸,它是一个极其困难的问题。为了从结构上缓解这种极端的复杂性,一种方法是对所有决策规则的空间进行建模,这样就可以在...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  •   a.需求分析:   自动生成小学四则运算题目的命令行 “软件”,满足以下需求:    除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24运算符为 +, −, ×, ÷并且要求能处理用户的输入,并判断对错,打分统计正确率。要求能处理用户输入的真分数, 如 1/2, 5/12 等使用 -n 参...