35 12 37 -58 54 76 22
1) 首先分别定义 low 和 high 用于存储数组第一个元素的下标和最后一个元素的下标,即 low=0,high=6。22 12 37 -58 54 76 35
4) 然后 low++==1,key 和 a[low] 比较,即 35 和 12 比较,12<35,则不用互换位置;继续 low++==2,然后 key 和 a[low] 比较,即 35 和 37 比较,37>35,则它们互换位置:22 12 35 -58 54 76 37
5) 然后 high--==5,key 和 a[high] 比较,即 35 和 76 比较,35<76,则不用互换位置;继续 high--==4,然后 key 和 a[high] 比较,即 35 和 54 比较,35<54,则不用互换位置;继续 high--==3,然后 key 和 a[high] 比较,即 35 和 -58 比较,35>–58,则它们互换位置:22 12 -58 35 54 76 37
6) 然后 low++==3,此时 low==high,第一轮比较结束。从最后得到的序列可以看出,35 左边的都比 35 小,35 右边的都比 35 大。这样就以 35 为中心,把原序列分成了左右两个部分。接下来只需要分别对左右两个部分分别重复上述操作就行了。# include <stdio.h> void Swap(int *, int *); //函数声明, 交换两个变量的值 void QuickSort(int *, int, int); //函数声明, 快速排序 int main(void) { int i; //循环变量 int a[] = {900, 2, -58, 3, 34, 5, 76, 7, 32, 4, 43, 9, 1, 56, 8,-70, 635, -234, 532, 543, 2500}; QuickSort(a, 0, 20); /*引用起来很简单, 0为第一个元素的下标, 20为最后一个元素的下标*/ printf("最终排序结果为:\n"); for (i=0; i<21; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; } void Swap(int *p, int *q) { int buf; buf = *p; *p = *q; *q = buf; return; } void QuickSort(int *a, int low, int high) { int i = low; int j = high; int key = a[low]; if (low >= high) //如果low >= high说明排序结束了 { return ; } while (low < high) //该while循环结束一次表示比较了一轮 { while (low < high && key <= a[high]) { --high; //向前寻找 } if (key > a[high]) { Swap(&a[low], &a[high]); ++low; } while (low < high && key >= a[low]) { ++low; //向后寻找 } if (key < a[low]) { Swap(&a[low], &a[high]); --high; } } QuickSort(a, i, low-1); //用同样的方式对分出来的左边的部分进行同上的做法 QuickSort(a, low+1, j); //用同样的方式对分出来的右边的部分进行同上的做法 }输出结果是:
# include <stdio.h> void QuickSort(int *, int, int); /*现在只需要定义一个函数, 不用交换还省了一个函数, 减少了代码量*/ int main(void) { int i; //循环变量 int a[] = {900, 2, -58, 3, 34, 5, 76, 7, 32, 4, 43, 9, 1, 56, 8,-70, 635, -234, 532, 543, 2500}; QuickSort(a, 0, 20); /*引用起来很简单, 0为第一个元素的下标, 20为最后一个元素的下标*/ printf("最终排序结果为:\n"); for (i=0; i<21; ++i) { printf("%d ", a[i]); } printf("\n"); return 0; } void QuickSort(int *a, int low, int high) { int i = low; int j = high; int key = a[low]; if (low >= high) //如果low >= high说明排序结束了 { return ; } while (low < high) //该while循环结束一次表示比较了一轮 { while (low < high && key <= a[high]) { --high; //向前寻找 } if (key > a[high]) { a[low] = a[high]; //直接赋值, 不用交换 ++low; } while (low < high && key >= a[low]) { ++low; //向后寻找 } if (key < a[low]) { a[high] = a[low]; //直接赋值, 不用交换 --high; } } a[low] = key; //查找完一轮后key值归位, 不用比较一次就互换一次。此时key值将序列分成左右两部分 QuickSort(a, i, low-1); //用同样的方式对分出来的左边的部分进行同上的做法 QuickSort(a, low+1, j); //用同样的方式对分出来的右边的部分进行同上的做法 }输出结果是:
5 1 9 3 7 4 8 6 2
5 正好处于 1~9 的中间,选择 5 作基准数可以平衡两边的递归深度。可如果是:1 5 9 3 7 4 8 6 2
选择 1 作为基准数,那么递归深度就全部都加到右边了。如果右边有几万个数的话则系统直接就崩溃了。所以需要对递归深度进行优化。怎么优化呢?就是任意取三个数,一般是取序列的第一个数、中间数和最后一个数,然后选择这三个数中大小排在中间的那个数作为基准数,这样起码能确保获取的基准数不是两个极端。
本文链接:http://task.lmcjl.com/news/3211.html