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~

posted @ 2018-11-29 15:06  DukeOfYork  阅读(5324)  评论(1)    收藏  举报