1. 程式人生 > 實用技巧 >C語言四種排序演算法總結

C語言四種排序演算法總結

Time : 2020-08-03 12:48:37

本文主要總結了C語言常見的四種排序演算法:

氣泡排序、插入排序、選擇排序、快速排序。

氣泡排序:

主要思想:將一串數字中的最大值(或最小值)排列到陣列的最後面,再將內層迴圈j的最大值向前移一位;

同理,這個時候將剩餘數字的最大值(或最小值)冒泡到陣列的倒數第二個位置,內層迴圈j的最大值向前移一位。

知道內層迴圈結束,整個排序也完成了。

時間複雜度為O(n2)

程式碼如下:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int    array[100] = {0};
 5
int sum = 0; 6 printf("Bubble sort algorithm:(enter q to quit)\n\n\n"); 7 while(1) 8 { 9 int i = 0, j = 0; 10 printf("Please enter the sum of your numbers:\n"); 11 if(scanf("%d", &sum) != 1) 12 break; 13 14 15 printf("
Please input your numbers:\n"); 16 17 for(i = 0;i<sum;i++) 18 scanf("%d", &array[i]); 19 20 for(i = 0;i<sum - 1;i++) 21 { 22 for(j = 0;j< sum - i - 1;j++) 23 { 24 if(array[j] > array[j+1]) 25 {
26 int temp = array[j]; 27 array[j] = array[j+1]; 28 array[j+1] = temp; 29 } 30 } 31 } 32 33 //array output 34 printf("\aThe sorted numbers are listed below: \n"); 35 for(i = 0;i<sum;i++) 36 printf("%d ", array[i]); 37 38 printf("\n"); 39 } 40 41 return 0; 42 }

插入排序:

插入排序類似於撲克牌的摸牌過程:

假設你手裡已經摸了一張牌,你再摸了一張,這個時候你需要把第二張牌與原來的一張比較,如果第二張比第一張要小,則將第二張放到第一張的左面;

當你摸第三張的時候,你需要將第三張依次與新的第一張和第二張比較並根據要求交換位置;

……

直到摸牌結束。

時間複雜度為O(n2)

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int array[100] = {0}, sum = 0;
 5     printf("Insertion sort algorithm:(enter q to quit)\n\n\n");
 6     while(1)
 7     {
 8         int i = 0, j = 0;
 9         printf("Please enter the sum of your numbers:\n");
10         if(scanf("%d", &sum) != 1)
11             break;
12         printf("Please input your numbers:\n"); 
13         for(i = 0;i<sum;i++)
14             scanf("%d", &array[i]);
15         
16         //核心演算法 
17         for(i =1 ;i < sum;i++)
18             for(j = i;j > 0; j--)
19             {
20                 if(array[j] < array[j -1])
21                 {
22                     int temp = array[j];
23                     array[j] = array[j-1];
24                     array[j-1] = temp;
25                 }
26             }
27         
28         //array output
29         printf("\aThe sorted numbers are listed below: \n");
30         for(i = 0;i<sum; i++)
31             printf("%d ", array[i]);
32         printf("\n");
33     }
34     return 0;
35 } 

選擇排序:

選擇排序就是從一串數字當中選擇出最小值(或最大值),將這個最小值(或最大值)排在首位,之後對於剩餘的數字進行同樣的操作即可。

時間複雜度為O(n2)

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int array[100] = {0};
 5     
 6     int sum = 0;
 7     printf("selection sort algorithm:(enter q to quit)\n\n\n");
 8     while(1)
 9     {
10         int i = 0, j = 0, min =0;
11         printf("Please enter the sum of your numbers:\n");
12         if(scanf("%d", &sum) != 1)
13             break;
14         
15         printf("Please input your numbers:\n"); 
16         for(i = 0;i<sum;i++)
17             scanf("%d", &array[i]);
18             
19         
20         for(i = 0;i<sum;i++)
21         {
22             min = i;
23             for(j = i;j<sum;j++)
24                 if(array[min] > array[j])
25                     min = j;
26             
27             //exchange array[i] and minimum element of remaining numbers
28             int temp = array[min];
29             array[min] = array[i];
30             array[i] = temp;
31         }
32         
33         
34         //array output
35         printf("\aThe sorted numbers are listed below: \n");
36         for(i = 0;i<sum;i++)
37              printf("%d ", array[i]);
38         printf("\n\n");
39     }
40     
41     return 0;
42  } 

快速排序:

設要排序的陣列是s[0]……s[sum-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。 一趟快速排序的演算法是: 1)設定兩個變數i、j,排序開始的時候:i=0,j=sum-1; 2)以第一個陣列元素作為關鍵資料,賦值給std,即std=A[0];
3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於std的值s[j],將s[j]和s[i]的值交換;
4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於std的s[i],將s[i]和s[j]的值交換 5)重複第3、4步,直到i=j; 注意: 3,4步中,如果沒找到符合條件的值,即3中s[j]不小於std,4中s[i]不大於std的時候只需要改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束。 時間複雜度為O(nlog2n),因此快速排序是一種比較高效的演算法。
 1 #include<stdio.h>
 2 void quicksort(int s[], int left, int right);
 3 void quicksort(int s[], int left, int right)
 4 {
 5     if(left < right)
 6     {
 7         int i = left, j = right, std = s[i];//std is the basic num 
 8         while(i < j)
 9         {
10             while(i < j &&s[j] > std) //right to left
11                 j--;
12             if(i < j &&s[j] <= std)
13                 s[i++] = s[j];
14             
15             while(i < j&& s[i] < std) //left to right
16                 i++;
17             if(i < j && s[i] >= std)
18                 s[j--] = s[i];    
19         }
20         s[i] = std;
21         quicksort(s, left, i - 1);
22         quicksort(s, i+1, right);
23     }
24     
25 }
26 int main()
27 {
28     int array[100] = {0};
29     int sum = 0;
30     printf("Quick sort algorithm:(enter q to quit)\n\n\n");
31 
32     while(1)
33     {
34         printf("Please enter the sum of your numbers:\n");
35 
36         if(scanf("%d", &sum) != 1)    break;
37         printf("Please input your numbers:\n"); 
38 
39         for(int i = 0;i < sum;i++)
40             scanf("%d", &array[i]);
41         int left = 0, right = sum-1;
42         quicksort(array, left, right);
43         
44         printf("\n");
45         
46         printf("\aThe sorted numbers are listed below: \n");
47 
48         for(int i = 0;i<sum;i++)
49             printf("%d ", array[i]);
50         printf("\n");
51     }
52     
53         
54     return 0;
55 }

以上便是關於這四種排序演算法的介紹。