算法:冒泡排序(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】
备注每周坚持学习数据结构和算法中。。。