插入排序算法
来源:互联网 发布:前锦网络南京地址 编辑:程序博客网 时间:2024/06/11 05:56
插入排序的大概思路
想想一下我们在玩斗地主时起牌的过程。手里的牌从小到大排列,然后每次摸一张新牌,都会直接插入到它相应的位置。这个过程比较类似插入排序。当然,算法都是要在特定的数据结构中进行的,排序一般在数组中进行。我们假设现在你的手中有13张牌,顺序混乱,我们要用一种固定的算法将这13张牌排好序,可以这样做:
- 从第二张牌开始,跟第一张相比,如果第一张比较大,则将第一张放到第二张的位置,并把第二张放到第一张的位置
- 处理第三张:假设第三张牌是N。跟第二张比,如果第二张大于N,则将第二张放到第三个位置。如果第一张大于N,则将第一张放到地二个位置。然后,将N这张牌放到最左边那张被移动过的牌的位置。
- 处理第四张:假设第四张牌是N。跟第三张比,如果第三张牌大于N,则将第三张牌放到第四个位置。跟第二张比,如果第二张大于N,则将第二张放到第三个位置。如果第一张大于N,则将第一张放到地二个位置。一旦发现某个位置小于或等于N,则停止向左对比。最后,将N这张牌放到最左边那张被移动过的牌的位置。如果没有一张牌被移动,则第四张牌也原地不动。
- ……
- 以同样的方法来处理至最后一张排,整把牌就排好序了。
以上就是插入排序在数组中移动的轨迹。请详细阅读并思考第2和第三步。
代码描述
下面用C#语言来描述
static void InsertionSort(int[] array){ int key = 0; for (int i = 1; i < array.Length; i++) { key = array[i]; int j = i - 1; while (j >= 0 && array[j] > key) { array[j + 1] = array[j]; j--; } array[j + 1] = key; }}
测试并运行
为了更加清晰地看出数组中的内容的变化,我们加入下面的一个方法来打印出整个数组
static void PrintArray(int[] arrya){ for (int i = 0; i < arrya.Length; i++) { Console.Write(arrya[i].ToString() + ", "); } Console.WriteLine();}
然后创建一个数组并调用InsertionSort
方法
int[] myArray = { 3, 2, 5, 101, 21, 6, 1 };InsertionSort(myArray);Console.WriteLine("排序后");PrintArray(myArray);
运行程序的输出结果为:
开始排序第1圈开始前为:3, 2, 5, 101, 21, 6, 1,本圈循环要排序的key为2第2圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key为5第3圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key为101第4圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key为21第5圈开始前为:2, 3, 5, 21, 101, 6, 1,本圈循环要排序的key为6第6圈开始前为:2, 3, 5, 6, 21, 101, 1,本圈循环要排序的key为1排序后1, 2, 3, 5, 6, 21, 101,
读者可以仔细对比一下输出的结果和上面扑克牌排序的描述文字
下面是完整的代码
class Program{ static void Main(string[] args) { int[] myArray = { 3, 2, 5, 101, 21, 6, 1 }; InsertionSort(myArray); Console.WriteLine("排序后"); PrintArray(myArray); } static void InsertionSort(int[] array) { Console.WriteLine("开始排序"); int key = 0; for (int i = 1; i < array.Length; i++) { Console.WriteLine("第{0}圈开始前为:", i); PrintArray(array); key = array[i]; Console.WriteLine("本圈循环要排序的key为" + key); int j = i - 1; while (j >= 0 && array[j] > key) { array[j + 1] = array[j]; j--; } array[j + 1] = key; } } static void PrintArray(int[] arrya) { for (int i = 0; i < arrya.Length; i++) { Console.Write(arrya[i].ToString() + ", "); } Console.WriteLine(); }}
0 0
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法---插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法---插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- Surprise ! I'm back!
- js装饰者模式
- display的属性及属性值意义
- 2017.2.27PAT level B 1003
- 【codevs1234】魔术球问题
- 插入排序算法
- java__给定由大写,小写字母和空格组成的字符串,返回 最后 一个单词的长度。 如果输入中不存在单词,返回 0。
- textView.setCompoundDrawablesWithIntrinsicBounds(item.mDrawable, item.mDrawable , null, null);
- leetcode-110-Balanced Binary Tree
- List<object[]>遍历出错
- 较简单的修改和添加功能(链接数据库)
- IO流_PrintWriter实现自动刷新和换行
- 《Netty in Action》中文版—第五章 ByteBuf
- Project euler 401 约数的平方和 (数论)