算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结
2013-12-04 09:06
781 查看
背景
这两天温习了 5 中排序算法,之前也都看过它们的实现,因为没有深入分析的缘故,一直记不住谁是谁,本文就记录一下我学习的一些心得。三种排序算法可以总结为如下:
都将数组分为已排序部分和未排序部分。
冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。
选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
冒泡排序
代码public static void Sort(T[] items) { if (items.Length < 2) { return; } int swappedTimes; do { swappedTimes = 0; // 重复的遍历数组。 for (var i = 1; i < items.Length; i++) { // 每次遍历都比较两个元素,如果顺序不正确就把他们交换一下。 if (items[i - 1].CompareTo(items[i]) > 0) { Swap(items, i - 1, i); swappedTimes++; } } } while (swappedTimes > 1);// 如果遍历后只交换了 1 次或 0 次,排序结束。 }
示例
【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】
插入排序
代码public static void Sort(T[] items) { for ( var sortedRangeEndIndex = 1; sortedRangeEndIndex < items.Length; sortedRangeEndIndex++) { if (items[sortedRangeEndIndex].CompareTo(items[sortedRangeEndIndex - 1]) < 0) { int insertIndex = FindInsertionIndex(items, items[sortedRangeEndIndex]); Insert(items, sortedRangeEndIndex, insertIndex); } } } private static int FindInsertionIndex(T[] items, T valueToInsert) { for (var i = 0; i < items.Length; i++) { if (items[i].CompareTo(valueToInsert) > 0) { return i; } } throw new InvalidOperationException(); } private static void Insert(T[] items, int indexInsertingFrom, int indexInsertingAt) { var temp = items[indexInsertingFrom]; for (var i = indexInsertingFrom; i > indexInsertingAt; i--) { items[i] = items[i - 1]; } items[indexInsertingAt] = temp; }
示例
【4,3,2,1】
【3,4,2,1】
【2,3,4,1】
【1,2,3,4】
选择排序
代码public static void Sort(T[] items) { for ( var sortedRangeEndIndex = 0; sortedRangeEndIndex < items.Length; sortedRangeEndIndex++) { int nextIndex = FindIndexOfSmallestFromIndex(items, sortedRangeEndIndex); Swap(items, sortedRangeEndIndex, nextIndex); } } private static int FindIndexOfSmallestFromIndex(T[] items, int sortedRangeEndIndex) { T currentSmallItem = items[sortedRangeEndIndex]; int currentSmllIndex = sortedRangeEndIndex; for (var i = sortedRangeEndIndex + 1; i < items.Length; i++) { if (currentSmallItem.CompareTo(items[i]) > 0) { currentSmallItem = items[i]; currentSmllIndex = i; } } return currentSmllIndex; }
示例
【4,3,2,1】
【1,3,2,4】
【1,2,3,4】
【1,2,3,4】
备注
每周坚持学习数据结构和算法中。。。相关文章推荐
- java基本算法总结(冒泡排序、选择排序、插入排序)
- 【从头开始学算法】选择排序 插入排序 冒泡排序
- 排序总结(1)---冒泡排序、选择排序、插入排序、希尔排序
- c语言排序之冒泡排序,选择排序,插入排序,快速排序总结
- c语言中冒泡排序、插入排序、选择排序算法比较
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 三个典型的经典算法冒泡排序,插入排序,选择排序
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 【算法】希尔排序,快速排序,选择排序,插入排序,冒泡排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- 算法总结JS版(三)—— 插入排序(Insertion Sort)
- 算法从排序开始——插入排序(Insertion Sort)C语言及Java实现
- 算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序
- 【C#算法】冒泡排序 选择排序 插入排序 希尔排序--转
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 算法总结-选择排序,插入排序
- 冒泡排序、选择排序、堆排序、快速排序、插入排序算法复杂度分析与算法实现(自己总结与转)
- PHP四种基础算法详解(冒泡排序、选择排序、插入排序、快速排序)
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)