直接插入排序:
这个算法有一个非常直观的理解,像我们斗地主整牌的时候,进行的其实就是插入排序。
那么要注意的一点就是,这个和选择排序的区别,选择排序是在无序序列中选最小值,然后将此值和队首位置的值交换,遍历整个序列达到排序的目的;而插入排序,是遍历无序序列,顺序将每一个数插入到前面的有序序列中,遍历完成,则算法完成。
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Net; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { for (int i = 1; i <= 5; i++) { List<int> list = new List<int>(); //插入2k个随机数到数组中 for (int j = 0; j < 2000; j++) { Thread.Sleep(1); list.Add(new Random((int)DateTime.Now.Ticks).Next(0, 100000)); } Console.WriteLine("\n第" + i + "次比较:"); Stopwatch watch = new Stopwatch(); watch.Start(); var result = list.OrderBy(single => single).ToList();//这里这个single=>single不懂 watch.Stop(); Console.WriteLine("\n系统的快速排序耗费时间:" + watch.ElapsedMilliseconds); Console.WriteLine("输出前是十个数:"+string.Join(",",result.Take(10).ToList())); watch.Start(); result = InsertSort(list); watch.Stop(); Console.WriteLine("\n堆排序耗费时间:" + watch.ElapsedMilliseconds); Console.WriteLine("输出前是十个数:" + string.Join(",", result.Take(10).ToList())); } Console.ReadLine(); } //插入排序算法 static List<int> InsertSort(List<int> list) { for (int i = 1; i < list.Count; i++) { int temp = list[i]; int j; for (j = i - 1; j >= 0 && temp < list[j]; j--) { list[j + 1] = list[j]; } list[j + 1] = temp; } return list; } } }
总结:这个算法总是和选择排序混淆,其实思想上有一些不同。