插入排序算法

来源:互联网 发布:前锦网络南京地址 编辑:程序博客网 时间:2024/06/11 05:56

插入排序的大概思路

想想一下我们在玩斗地主时起牌的过程。手里的牌从小到大排列,然后每次摸一张新牌,都会直接插入到它相应的位置。这个过程比较类似插入排序。当然,算法都是要在特定的数据结构中进行的,排序一般在数组中进行。我们假设现在你的手中有13张牌,顺序混乱,我们要用一种固定的算法将这13张牌排好序,可以这样做:

  1. 从第二张牌开始,跟第一张相比,如果第一张比较大,则将第一张放到第二张的位置,并把第二张放到第一张的位置
  2. 处理第三张:假设第三张牌是N。跟第二张比,如果第二张大于N,则将第二张放到第三个位置。如果第一张大于N,则将第一张放到地二个位置。然后,将N这张牌放到最左边那张被移动过的牌的位置。
  3. 处理第四张:假设第四张牌是N。跟第三张比,如果第三张牌大于N,则将第三张牌放到第四个位置。跟第二张比,如果第二张大于N,则将第二张放到第三个位置。如果第一张大于N,则将第一张放到地二个位置。一旦发现某个位置小于或等于N,则停止向左对比。最后,将N这张牌放到最左边那张被移动过的牌的位置。如果没有一张牌被移动,则第四张牌也原地不动。
  4. ……
  5. 以同样的方法来处理至最后一张排,整把牌就排好序了。

以上就是插入排序在数组中移动的轨迹。请详细阅读并思考第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,本圈循环要排序的key22圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key53圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key1014圈开始前为:2, 3, 5, 101, 21, 6, 1,本圈循环要排序的key215圈开始前为:2, 3, 5, 21, 101, 6, 1,本圈循环要排序的key66圈开始前为:2, 3, 5, 6, 21, 101, 1,本圈循环要排序的key1排序后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
原创粉丝点击