1. 程式人生 > 實用技巧 >簡單排序+堆排序

簡單排序+堆排序

注:所有排序以從小到大排序為例,且函式介面統一定義為:void sortname_sort(int a[], int n)

簡單排序:

簡單排序有三種:選擇排序,氣泡排序,插入排序。其中選擇排序非常簡單,就是從要排序的數列裡找到最小的放在最前面,以此類推,最終完成排序,程式碼省略。

氣泡排序:

思路是相鄰兩個元素比較大小如果前面元素大於後面的,則交換位置,最終可以將最大值放在數列最後一個,然後重複上述步驟。

示例程式碼:

 1 // Bubble sort
 2 #include <iostream>
 3 using namespace std;
 4 void bubble_sort(int
a[],int n) 5 { 6 for(int i = n-1; i >= 0; i--) 7 { 8 for(int j = 0; j < i; j++) 9 { 10 if(a[j] > a[j+1]) 11 { 12 int tmp = a[j]; 13 a[j] = a[j+1]; 14 a[j+1] = tmp; 15 } 16 }
17 } 18 } 19 20 int main() 21 { 22 int a[] = {10,2,1,5,4,3,9,7,6,8}; 23 const int n = 10; 24 bubble_sort(a,n); 25 for(int i = 0; i < n; i++) cout << a[i] << " "; 26 return 0; 27 }

插入排序:

思路類似於打撲克牌時摸牌整理牌的過程,挑一張最小的放在最左邊,再挑一張小的放在左邊。

示例程式碼:

 1 // Insertion sort
 2 #include <iostream>
 3
using namespace std; 4 void insert_sort(int a[], int n) 5 { 6 for(int i = 1; i < n; i++) 7 { 8 int tmp0 = a[i], tmp1 = i-1, tmp2 = i; 9 while(tmp1 >= 0 && a[tmp1] >= tmp0) {a[tmp2] = a[tmp1]; tmp2 = tmp1; tmp1--;} // 選擇地方插入的過程 10 a[tmp2] = tmp0; // 找到位置,插入數 11 } 12 } 13 int main() 14 { 15 int a[] = {10,2,1,5,4,3,9,7,6,8}; 16 const int n = 10; 17 insert_sort(a,n); 18 for(int i = 0; i < n; i++) cout << a[i] << " "; 19 return 0; 20 }

堆排序:

利用小頂堆來排序,程式碼非常簡單。

示例程式碼

 1 // Heap sort
 2 #include <iostream>
 3 #include <queue> // 注意標頭檔案
 4 using namespace std;
 5 void heap_sort(int a[], int n)
 6 {
 7     int i,j;
 8     priority_queue<int, vector<int>, greater<int> > q; // 建立小頂堆
 9     for(i = 0,j = 0; i < n; i++) q.push(a[i]); // 資料入堆
10     while(!q.empty()) {a[j++] = q.top(); q.pop();} // 出堆
11 }
12 int main()
13 {
14     int a[] = {10,2,1,5,4,3,9,7,6,8};
15     const int n = 10;
16     heap_sort(a,n);
17     for(int i = 0; i < n; i++) cout << a[i] << " ";
18     return 0;
19 }