c++快速排序
本肥宅开始自己的刷题之路了,作为第一个目标,我选择了快速排序。
讲完快排没有多长时间,老师也是一笔带过,又碰巧在洛谷上发现了这道题,碰巧作下,就酱紫~
快排挺好玩的,原理也很简单:在待排的数据中随机挑选一个数据作为关键数据(用key代替),然后,小的放在key前,大的放在key后,再分别对 “小的一段” 和 “大的一段” 进行快排就可以了~
1 #include <iostream> 2 3 using namespace std; 4 5 int N, a[100001]; 6 void swap (int& a, int& b); 7 void qSort (int front = 1,int rear = N); 8 int main(){ 9 cin >> N; 10 for (int i = 1;i <= N;i++) 11 cin >> a[i]; 12 qSort(); 13 for (int i = 1;i <= N;i++) 14 cout << a[i] <<' '; 15 system("PAUSE"); 16 return 0; 17 } 18 19 void swap (int& a, int& b){ 20 int c = a; 21 a = b; 22 b = c; 23 } 24 25 void qSort (int front,int rear){ 26 if (front >= rear) 27 return; 28 swap(a[front], a[(front + rear)/2]); 29 int i = front,j = rear,k = a[front]; 30 while (i < j){ 31 while (a[j] > k&&i < j) j--; 32 a[i++] = a[j]; 33 while (a[i] < k&&i < j) i++; 34 a[j--] = a[i]; 35 } 36 a[(i+j+1)/2] = k; 37 qSort(front, (i+j+1)/2-1); 38 qSort((i+j+1)/2+1, rear); 39 }
但是呢,排序的时候可不是单纯的随机挑选 key ,再创建一个数组,把原来要排序的数组扫描进去。这样很麻烦的。
本文代码中,在 qSort 函数中选择 i , j 两个变量,分别从头、尾进行扫描,我这里每次选择待排序数组 a 中的第一个数作为 key ,然后呢,我选择先从尾部进行扫描(这时的 a[front] 的值已经被存储)(所以 front 位置的数值就没用喽~)将发现的第一个比 key 小的值放到 front 位置(同理,这时 j 位置的数值就没用了)(而且 i 的位置就放上了比 key 小的数字,i自然就要++啦~)然后等到它慢慢循环到 i == j(大雾)就结束这一部分了。
最后就是寻找 key 应该住的位置,把它正位,再递归 qSort() 就完成了!~
什么?还有 swap(a[front], a[(front + rear)/2]); ?当然是为了防止 oj 用升序或者降序的测试点卡我啦,hhhh~

浙公网安备 33010602011771号