1 /*
2 Tue Mar 24 20:07:26 2020
3
4 目的:快速排序
5 结论:快排真难,算法头秃
6 功能:首先取数组首端元素为基准数(temp),先从右往左依次比较出首个
7 比基准数小的元素,再从左往右依次比较出首个比基准数大的元素,两者
8 互换,重复以上操作,注意先右后左,直到i=j,a[i]与基准数互换
9
10 形成新的序列,左边为小于基准数序列,右边为大于基准数序列。
11
12 此时从左侧序列开始重复以上操作,直到左侧序列为升序排列,
13 再从右侧序列开始重复以上操作 ,直到右侧序列为升序排列。
14 左右先后无影响
15
16 程序结束
17 */
18 #include
19 //n:获取数组内容的实际大小
20
21 int a[101],n;
22
23 void quicksort(int left ,int right ) //left数组的首端索引,right数组的尾端索引
24 {
25 /*
26 i: 快排每段分治时的首端索引
27 j: 快排每段分治时的尾端索引
28 temp:基准数
29 */
30 int i, j, t, temp;
31
32 /*
33 这段代码漏了,会导致程序执行到递归时,right不断自减为0,
34 left不变一直为1,left>right,i与j不会变化,
35 程序死循环,无法快排 。
36 */
37 if(left > right)//首端索引大于尾端索引,快排无法进行
38 return;
39
40 //赋值
41
42 temp = a[left];
43 i = left;
44 j = right;
45
46 /*
47 数组索引j为找到比基准数小的值判断a[j]是否大于temp
48 是则递减直到找到a[j]小于基准数。
49 数组索引i为找到比基准数大的值判断a[i]是否小于temp
50 是则递增直到找到a[i]大于基准数。
51 */
52 while(i != j) {
53
54 while(a[j] >= temp && i < j)
55 {
56 j--;
57 }
58 while(a[i] <= temp && i
59 {
60 i++;
61 }
62 /*
63 这样写看似符合快排逻辑,实际上结果是将大数往前排
64 '小数'往后排,是倒序快排,大的往左放,小的往右放。
65 while(a[j] <= temp && i < j) {
66 j--;
67 }
68 while(a[i] >= temp && i
69 i++;
70 }
71 */
72
73 //
74 if(i < j) {
75 t = a[i];
76 a[i] = a[j];
77 a[j]= t;
78 }
79 }
80 //重调基准数
81 a[left] = a[i];//确定新的基准数
82 a[i] = temp;//将前一个基准数置中于序列
83 /*temp=a[i];
84 temp的值由a[left]确立
85 这样写会导致中间序列数无法确认
86 */
87
88 /*
89 左侧序列快排及右侧序列快排
90 先后顺序对结果无影响
91 */
92 quicksort(i+1,right);
93 quicksort(left,i-1);
94
95 }
96 int main () {
97 /*
98 i:控制数组输入输出的次数
99 n:数组实际长度
100 */
101 int i;
102
103 scanf("%d",&n);
104 for(i = 1; i <= n; i++) {
105 scanf("%d",&a[i]);
106 }
107
108 quicksort(1,n);
109
110 for(i = 1; i <= n; i++) {
111 printf("%d",a[i]);
112 }
113 return 0;
114 }
参考链接:https://blog.youkuaiyun.com/vayne_xiao/article/details/53508973?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
标签:right,temp,快排,基准,C语言,索引,left
来源: https://www.cnblogs.com/MoMei25/p/12561876.html