1. 程式人生 > 實用技巧 >排序演算法總結

排序演算法總結

今天在複習了以前的筆記,發現我有很多遺忘又很重要的知識點。

排序演算法,我自己明白的:1、氣泡排序演算法。2、選擇排序演算法。其中選擇排序演算法又分為陣列和連結串列的。3、STL函式中的sort()函式呼叫(最簡便的。。。)

首先明白選擇排序演算法和氣泡排序演算法的區別:(選自度娘

冒泡演算法,每次比較如果zhi發現較小的元素在後面,就交換兩個相鄰的元素。

而選擇排序演算法的改進在於:先並不急於調換位置,先從A[1]開始逐個檢查,看哪個數最小就記下該數所在的位置P,等一躺掃描完畢,再把A[P]和A[1]對調,這時A[1]到A[10]中最小的資料就換到了最前面的位置。

所以,選擇排序每掃描一遍陣列,只需要一次真正的交換,而冒泡可能需要很多次。比較的次數一樣的。

陣列的方法..

 1 //選擇法排序(以陣列實現)
 2 int main()
 3 {
 4     int arr[10] = { 0 };
 5     int n = sizeof(arr) / sizeof(arr[0]);
 6     int i = 0, j = 0, min = 0;
 7 
 8     printf("請輸入%d個int資料\n", n);
 9     for (i = 0; i < n-1; i++)
10     {
11         for (min = i, j = min + 1; j < n; j++)
12         {
13             if
(arr[min] > arr[j]) 14 min = j; 15 } 16 17 if (min != i) 18 { 19 int tmp = 0; 20 tmp = arr[i]; 21 arr[i] = arr[min]; 22 arr[min] = tmp; 23 } 24 } 25 26 for (i = 0; i < n; i++) 27 { 28 printf("
%d", arr[i]); 29 } 30 printf("\n"); 31 32 return 0; 33 }

連結串列的方法...

 1 void sort_link(STU *head)
 2 {
 3     //1、判斷連結串列是否存在
 4     if(NULL == head)
 5     {
 6         printf("link not found\n");
 7         return;
 8     }
 9     else
10     {
11         STU *p_i = head;//i=0 
12         while(p_i->next != NULL)//i<n-1  外層迴圈
13         {
14             STU *p_min = p_i;//min = i;
15             STU *p_j = p_min->next;//j = min+1
16             while(p_j != NULL)//j<n  內層迴圈
17             {
18                 
19                 //尋找成員num最小值的 節點
20                 if(p_min->num > p_j->num)//if(arr[min] > arr[j])
21                     p_min = p_j;//min = j
22                 p_j = p_j->next;//j++
23             
24             }
25 
26             if(p_min != p_i)//min != i
27             {
28                 //只交換資料域(1、節點內容整體交換   2、只交換指標域)
29                 //1、節點內容整體交換(資料域交換第1次   指標域交換第1次)
30                 STU tmp;
31                 tmp = *p_i;
32                 *p_i = *p_min;
33                 *p_min = tmp;
34 
35                 //2、只交換指標域(指標域交換第2次)
36                 tmp.next = p_i->next;
37                 p_i->next = p_min->next;
38                 p_min->next = tmp.next;
39             }
40 
41 
42             p_i = p_i->next;//i++
43         }
44         
45     }
46     
47 }

最後還有一個STL庫裡的sort()函式。把數字存到容器裡就可用...