算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和選擇排序(Selection Sort)總結


背景

這兩天溫習了 5 中排序算法,之前也都看過它們的實現,因為沒有深入分析的緣故,一直記不住誰是誰,本文就記錄一下我學習的一些心得。

三種排序算法可以總結為如下:

  • 都將數組分為已排序部分和未排序部分。
  • 冒泡排序將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。
  • 插入排序將已排序部分定義在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。
  • 選擇排序將已排序部分定義在左端,然后選擇未排序部分的最小元素和未排序部分的第一個元素交換。

冒泡排序

代碼

 1         public static void Sort(T[] items)
 2         {
 3             if (items.Length < 2)
 4             {
 5                 return;
 6             }
 7 
 8             int swappedTimes;
 9             do
10             {
11                 swappedTimes = 0;
12                 // 重復的遍歷數組。
13                 for (var i = 1; i < items.Length; i++)
14                 {
15                     // 每次遍歷都比較兩個元素,如果順序不正確就把他們交換一下。
16                     if (items[i - 1].CompareTo(items[i]) > 0)
17                     {
18                         Swap(items, i - 1, i);
19                         swappedTimes++;
20                     }
21                 }
22             } while (swappedTimes > 1);// 如果遍歷后只交換了 1 次或 0 次,排序結束。
23         }

示例

【4,3,2,1】

【3,4,2,1】

【3,2,4,1】

【3,2,1,4】

【2,3,1,4】

【2,1,3,4】

【1,2,3,4】

插入排序

代碼

 1         public static void Sort(T[] items)
 2         {
 3             for (
 4                 var sortedRangeEndIndex = 1;
 5                 sortedRangeEndIndex < items.Length;
 6                 sortedRangeEndIndex++)
 7             {
 8                 if (items[sortedRangeEndIndex].CompareTo(items[sortedRangeEndIndex - 1]) < 0)
 9                 {
10                     int insertIndex = FindInsertionIndex(items, items[sortedRangeEndIndex]);
11                     Insert(items, sortedRangeEndIndex, insertIndex);
12                 }
13             }
14         }
15 
16         private static int FindInsertionIndex(T[] items, T valueToInsert)
17         {
18             for (var i = 0; i < items.Length; i++)
19             {
20                 if (items[i].CompareTo(valueToInsert) > 0)
21                 {
22                     return i;
23                 }
24             }
25 
26             throw new InvalidOperationException();
27         }
28 
29         private static void Insert(T[] items, int indexInsertingFrom, int indexInsertingAt)
30         {
31             var temp = items[indexInsertingFrom];
32 
33             for (var i = indexInsertingFrom; i > indexInsertingAt; i--)
34             {
35                 items[i] = items[i - 1];
36             }
37 
38             items[indexInsertingAt] = temp;
39         }

示例

【4,3,2,1】

【3,4,2,1】

【2,3,4,1】

【1,2,3,4】

選擇排序

代碼

 1         public static void Sort(T[] items)
 2         {
 3             for (
 4                 var sortedRangeEndIndex = 0;
 5                 sortedRangeEndIndex < items.Length;
 6                 sortedRangeEndIndex++)
 7             {
 8                 int nextIndex = FindIndexOfSmallestFromIndex(items, sortedRangeEndIndex);
 9                 Swap(items, sortedRangeEndIndex, nextIndex);
10             }
11         }
12 
13         private static int FindIndexOfSmallestFromIndex(T[] items, int sortedRangeEndIndex)
14         {
15             T currentSmallItem = items[sortedRangeEndIndex];
16             int currentSmllIndex = sortedRangeEndIndex;
17 
18             for (var i = sortedRangeEndIndex + 1; i < items.Length; i++)
19             {
20                 if (currentSmallItem.CompareTo(items[i]) > 0)
21                 {
22                     currentSmallItem = items[i];
23                     currentSmllIndex = i;
24                 }
25             }
26 
27             return currentSmllIndex;
28         }

示例

【4,3,2,1】

【1,3,2,4】

【1,2,3,4】

【1,2,3,4】

備注

每周堅持學習數據結構和算法中。。。

 


免責聲明!

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



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