[Unity算法]交換排序(一):冒泡排序


0.簡介

交換排序的基本思想是:兩兩比較,如果兩個記錄不滿足次序要求,則進行交換,直到整個序列全部滿足要求為止

冒泡排序是一種最簡單的交換排序方法,它通過兩兩比較相鄰記錄,如果發生逆序,則進行交換,從而使小的記錄如氣泡一樣逐漸往上“漂浮”(左移),或者使大的記錄如石塊一樣逐漸往下“墜落”(右移),即升序排列

 

1.算法思想

a.設待排序的記錄存放在數組r[1..n]中。首先將第1個記錄和第2個記錄進行比較,若為逆序(r[1]>r[2]),則交換。然后比較第2個和第3個,依次類推,直到第n-1個和第n個比較完為止。上述過程稱作第1趟排序,其結果使得最大的記錄放到最后的位置上

b.然后進行第2趟排序,對前n-1個記錄進行同樣操作,其結果使得次大的記錄放到n-1的位置上

c.重復上述過程,直到某一趟排序過程中沒有進行過交換記錄的操作,說明完成了排序

例:

起始:{1,2,5,4,3}

第1趟:{1,2,4,3,5}

第2趟:{1,2,3,4,5}

第3趟:結束排序算法

即每一趟確定1個記錄的最終位置

 

2.算法實現

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 namespace TestSort
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             List<int> list = new List<int> { 49, 38, 65, 97, 76, 13, 27, 49};
11 
12             Program p = new Program();
13             p.Print(list, "排序前:");
14             p.BubbleSort(list);
15             p.Print(list, "排序后:");
16             
17             Console.ReadKey();
18         }
19 
20         void Print(List<int> list, string tag)
21         {
22             string str = tag;
23             for (int i = 0; i < list.Count; i++)
24             {
25                 str += list[i].ToString();
26                 str += ",";
27             }
28             Console.WriteLine(str);
29         }
30 
31         //冒泡排序
32         void BubbleSort(List<int> list)
33         {
34             int m = list.Count - 1;
35             int flag = 1;//flag用來標記某一趟排序是否發生交換(1表示進行了交換)
36             while ((m > 0) && (flag == 1))
37             {
38                 flag = 0;//flag置為0,如果本趟排序沒有發生交換,則不會執行下一趟排序
39                 for (int j = 0; j < m; j++)
40                 {
41                     if (list[j] > list[j + 1])
42                     {
43                         flag = 1;
44 
45                         //交換
46                         int temp = list[j];
47                         list[j] = list[j + 1];
48                         list[j + 1] = temp;
49                     }
50                 }
51                 m--;
52             }
53         }
54     }
55 }

結果:

 

3.算法分析

a.時間復雜度

最好情況(初始序列為正序):只需進行一趟排序

最壞情況(初始序列為正序):需進行n-1趟排序

平均情況:O(n2)

b.空間復雜度

只有在交換時需要一個輔助空間用做暫存記錄,所以為O(1)

 

4.算法特點

a.是穩定排序

b.可提前結束算法

c.當初始記錄無序,n較大時,此算法不宜采用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM