快速排序

快速排序:

有点归并排序的思想,分而治之。主要分为主元选取,子集划分两个阶段。主元选取有点讲究,不同的主元会导致运算效率不同,并且排序数量的大小也会影响效率,如果排序数为100以下,有时插入排序要比快速排序效率更高,此时可以设定一个阈值来确定用哪个排序算法。

示例代码:

此处为了方便,将要排序的最右边的数当作主元pivot

 1 // Quick sort
 2 #include <iostream>
 3 using namespace std;
 4 void qsort(int a[], int l, int r)
 5 {
 6     if(l >= r) return;
 7     int i = l, j = r-1, pivot = a[r];
 8     while(true)
 9     {
10         while(a[i] < pivot) i++;
11         while(a[j] > pivot) j--;
12         if(i < j) swap(a[i++], a[j--]); // 注意此处要处理i和j的值
13         else break;
14     }
15     swap(a[i],a[r]); // 注意,i最终的位置才是主元要放的位置,此时主元的位置已最终确定
16     qsort(a,l,i-1);
17     qsort(a,i+1,r);
18 }
19 void quick_sort(int a[], int n)
20 {
21     qsort(a,0,n-1);
22 }
23 int main()
24 {
25     int a[] = {10,2,1,5,4,3,9,7,6,8};
26     const int n = 10;
27     quick_sort(a,n);
28     for(int i = 0; i < n; i++) cout << a[i] << " ";
29     return 0;
30 }

 

posted @ 2020-08-21 13:43  不敢说的梦  阅读(162)  评论(0)    收藏  举报