常用排序算法

bubble_sort:将序列划分为无序区跟有序区,不断通过交换较大的元素至无序区尾完成排序。

 1 #include <cstdio>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 void bubble_sort(int arr[], int n){
 7     for (int i = 0; i < n - 1; ++i){
 8         for (int j = 0; j < n - i - 1; ++j){
 9             if (arr[j + 1] < arr[j]){
10                 swap(arr[j + 1], arr[j]);
11             }
12         }
13     }
14 }
15 
16 int main(){
17     int arr[] = { 1, 2, 10, 3, 2, 11, 22};
18     bubble_sort(arr, sizeof(arr)/ sizeof(int));
19     for (int i = 0; i < sizeof(arr) / sizeof(int); ++i)
20         cout << arr[i] << " ";
21     cout << endl;
22     return 0;
23 }
View Code

 

heap_sort:利用堆的思想,先建立堆,然后将堆首与堆尾交换,并减少堆的大小,则堆尾后面的即为有序区。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 #define lson(x) (x << 1)
 7 #define rson(x) (x << 1 | 1)
 8 
 9 void printArray(int a[], int sz){
10     for (int i = 1; i <= sz; ++i)
11         cout << a[i] << " ";
12     cout << endl;
13 }
14 
15 //保持堆的性质
16 void maxHeapify(int a[], int x, int sz){
17     int Max = x, ls = lson(x), rs = rson(x);
18     if (ls <= sz && a[ls] > a[Max]) Max = ls;
19     if (rs <= sz && a[rs] > a[Max]) Max = rs;
20     if (Max != x){
21         swap(a[x], a[Max]);
22         maxHeapify(a, Max, sz);
23     }
24 }
25 void buildMaxHeap(int a[], int sz){
26     for (int i = sz / 2; i >= 1; --i)// 节点i 的父亲即为 i / 2, 故最后一个非叶子节点为 sz / 2
27         maxHeapify(a, i, sz);
28 }
29 void heapSort(int a[], int sz){
30     buildMaxHeap(a, sz);
31     int len = sz;
32     for (int i = sz; i >= 2; --i){
33         swap(a[1], a[i]);//最大的放在最后面
34         len--;
35         maxHeapify(a, 1, len);
36     }
37 }
38 int main(){
39     int arr[] = {0, 4, 2, 1, 3, 6, 5 ,5};
40     int sz = sizeof(arr) / sizeof(int) - 1;
41     printArray(arr, sz);
42     heapSort(arr, sz);
43     printArray(arr, sz);
44 }
View Code

 

insert_sort:将数组分为有序区和无序区,不断的将无序区的第一个元素插入到有序区。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 //插入排序,前 i - 1个为已经排好序的每次把第i个插入到前i - 1当中
 7 //选择排序 每次从未排序的里面选择一个最小的。
 8 void insert_sort(int list[], int n){
 9     for (int i = 1; i < n; ++i){
10         if (list[i - 1] > list[i]){
11             int tmp = list[i], j = i;
12             while (j > 0 && list[j - 1] > tmp){
13                 list[j] = list[j - 1];
14                 --j;
15             }
16             list[j] = tmp;
17         }
18     }
19 }
20 
21 int main(){
22     int x[] = {6, 2, 4, 1, 5, 9};
23     insert_sort(x, 6);
24     for (int i = 0; i < 6; ++i)
25         cout << x[i] <<" ";
26     cout << endl;
27     return 0;
28 }
View Code

 

merge_sort:将原序列划分为有序的两个序列,然后利用归并算法进行合并。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 //可以 利用 非递归, 不回写, 插入排序来优化
 7 void merge(int arr[], int low, int mid, int high, int sorted[]){
 8     int i = low, j = mid, k = 0;
 9     while (i < mid && j < high){
10         if (arr[i] < arr[j]){
11             sorted[k++] = arr[i++];
12         }
13         else{
14             sorted[k++] = arr[j++];
15         }
16     }
17     while (i < mid) sorted[k++] = arr[i++];
18     while (j < high) sorted[k++] = arr[j++];
19     for (int i = 0; i < k; ++i)
20         arr[low + i] = sorted[i];
21 }
22 
23 void merge_sort(int arr[], int low, int high, int sorted[]){
24     if (low + 1 < high){
25         int mid = (low + high) >> 1;
26         merge_sort(arr,low, mid, sorted);
27         merge_sort(arr,mid, high, sorted);
28         merge(arr, low, mid, high, sorted);
29     }
30 }
31 
32 int main(){
33     int x[] = { 6, 2, 4, 1, 5, 9};
34     int n = sizeof(x) / sizeof(int);
35     int * sorted = new int[n];
36     merge_sort(x, 0, n - 1, sorted);
37     for (int i = 0; i < n; ++i)
38         cout << x[i] << " ";
39     cout << endl;
40 }
View Code

 

quick_sort:寻找一个中间点,然后左右递归排序。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 int partition(int  list[], int low, int high){
 9     if (low >= high) return low;
10 
11     int k = rand() % (high - low + 1) + low;
12     swap(list[low], list[k]);
13 
14     int pivot = list[low];
15     while (low < high){
16         while (low < high && list[high] > pivot) high--;
17         list[low] = list[high];
18         while (low < high && list[low] <= pivot) low++;
19         list[high] = list[low];
20     }
21     list[low] = pivot;
22     return low;
23 }
24 
25 void q_sort(int list[], int low, int high){
26     int loc = 0;
27     if (low < high){
28         loc = partition(list, low, high);
29         q_sort(list, low, loc - 1);
30         q_sort(list, loc + 1, high);
31     }
32 }
33 
34 //淘宝快排
35 void q_sort2(int list[], int low, int high){
36     if (low >= high) return ;
37     //随机化
38     int k = rand() % (high - low + 1) + low;
39     swap(list[low], list[k]);
40 
41     //插入排序优化
42     if (high - low <= 6){
43         for (int i = low + 1; i <= high; ++i){
44             if (list[i - 1] > list[i]){
45                 int tmp = list[i], j = i;
46                 while (j > 0 && list[j - 1] > tmp){
47                     list[j] = list[j - 1];
48                     j--;
49                 }
50                 list[j] = tmp;
51             }
52         }
53         return ;
54     }
55     //qsort
56     int x = list[low], j = low;
57     for (int i = low + 1; i <= high; ++i)
58         if (list[i] < x) swap(list[++j], list[i]);
59     swap(list[low], list[j]);
60     q_sort2(list, low, j - 1);
61     q_sort2(list, j + 1, high);
62 }
63 
64 int main(){
65     srand(time(NULL));
66     int x[10] = {6, 2, 4, 1, 5, 9, 10, 2, 11, 12};
67     q_sort2(x, 0, 9);
68     for (int i = 0; i <= 9; ++i)
69         cout << x[i] << " ";
70     cout << endl;
71     return 0;
72 }
View Code

shell_sort:增量缩小排序,分组插入。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 //希尔排序就是分组插入排序
 7 //便于理解
 8 void shell_sort1(int a[], int n){
 9     for (int gap = n / 2; gap > 0; gap /= 2){//步长
10         for (int i = 0; i < gap; ++i){ // 直接插入排序
11             for (int j = i + gap; j < n; j += gap){
12                 if (a[j] < a[j - gap]){
13                     int tmp = a[j], k = j - gap;
14                     while (k >= 0 && a[k] > tmp){
15                         a[k + gap] = a[k];
16                         k -= gap;
17                     }
18                     a[k + gap] = tmp;
19                 }
20             }
21         }
22     }
23 }
24 
25 //简化代码
26 void shell_sort2(int a[], int n){
27     for (int gap = n / 2; gap > 0; gap /= 2){
28         for (int j = gap; j < n; ++j){
29             if (a[j] < a[j - gap]){
30                 int tmp = a[j], k = j - gap;
31                 while (k >= 0 && a[k] > tmp){
32                     a[k + gap] = a[k];
33                     k -= gap;
34                 }
35                 a[k + gap] = tmp;
36             }
37         }
38     }
39 }
40 
41 int main(){
42     int x[] = {2, 4, 6, 3,5 ,1};
43     int n = sizeof(x) / sizeof(int);
44     shell_sort1(x, 6);
45     for (int i = 0; i < 6; ++i)
46         cout <<x[i] << " ";
47     cout << endl;
48     int y[] = {8, 4, 6, 3,5 ,1};
49     n = sizeof(y) / sizeof(int);
50     shell_sort1(y, 6);
51     for (int i = 0; i < 6; ++i)
52         cout <<y[i] << " ";
53     cout << endl;
54     return 0;
55 }
View Code

 

posted @ 2013-08-26 22:05  Missa  阅读(384)  评论(0编辑  收藏  举报