插入排序
摘要:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置
将n个元素的数列分为已有序和无序两个部分,如下所示:
{{a1},{a2,a3,a4,…,an}}
{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
…
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
View Code
class Program { static void InsertSort(int[] arry)//插入排序核心代码 { /* for (int i = 1; i < arry.Length; i++)//无序数列的下标是从1开始 { int curvalue = arry[i];//存储当前数值 int temp = i;//存储当前下标,表示比较到哪一个位置 while (temp > 0 && arry[temp - 1] > curvalue) //arry[temp - 1]代表curvalue前一个数 { arry[temp] = arry[temp - 1]; temp--; } arry[temp] = curvalue;用while循环来写的比较精炼,下面的更容易理解,更符合常规思维 }*/ for (int i = 1; i < arry.Length; i++)//无序数列的下标是从1开始 { int curvalue = arry[i];//必须用变量保存当前准备要加入到有序数列中的值,否则后面arry[i]会与arry[j]代表同一个元素,造成冲突 for (int j = i; j > 0; j--) { if (arry[j - 1] > curvalue) { arry[j] = arry[j - 1]; arry[j - 1] = curvalue ; } } } } static void Show(int[] array) { for (int i = 0; i < array.Length; i++) { Console.Write("{0} ,", array[i]); } Console.WriteLine(""); } static void Main(string[] args) { int[] a = { 0, 88, 8, 7, 45, 5, 4, 4, 9, 1, 0, -1 }; InsertSort(a); Show(a); } }