using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace InsertAlgorithm { class Program { static int[] num = new int[10]; static void Main(string[] args) { InitData(); num=Sort(num); ShowArrayValues(num); Console.WriteLine("\n插入数据:"); int x=int.Parse(Console.ReadLine()); DirectlyInsert(num, x); DichotomyInsertSort(num, x); Console.ReadKey(); } //自动生成测试数据 static void InitData() { for (int i = 0; i < num.Length; i++) { var Seed = Guid.NewGuid().GetHashCode(); var value = new Random(Seed); num[i] = value.Next(1, 100); } } /// <summary> /// 直接插入排序 /// </summary> static void DirectlyInsert(int[] num,int target) { int[] endArray = new int[num.Length + 1]; endArray[0] = target; for (int i = 1; i < endArray.Length; i++) { endArray[i] = num[i - 1]; } for (int i = 0; i < endArray.Length-1; i++) { if(endArray[i]>endArray[i+1]) { int temp = endArray[i]; endArray[i] = endArray[i+1]; endArray[i + 1] = temp; } else { break; } } Console.WriteLine("直接插入排序:"); ShowArrayValues(endArray); } /// <summary> /// 折半插入排序(二分插入排序) /// </summary> static void DichotomyInsertSort(int[] num, int target) { //将原数组复制一遍,新数组首位是欲插入值,后面是endArray[i+1]=num[i] int[] endArray =new int[num.Length+1]; for (int i = 0; i < num.Length; i++) { endArray[i+1] = num[i]; } endArray[0] = target; Console.WriteLine("\n二分插入排序:"); int low = 1, mid, high = num.Length; int index = 0; //1.当目标值位于最小值与最大值中间 //2.当目标值小于最小值 //3.当目标值大于最小值 while(low<=high) { mid=low+((high-low)/2); if (endArray[low] <= target && endArray[mid] >= target) { high = mid; } else if (endArray[mid] < target && endArray[high] >= target) { low = mid; } else if (endArray[low] > target) { index = low - 1; break; } else if (endArray[high] < target) { index = high; break; } if (low + 1 == high) { index = low; break; } } //左边左移 for (int i = 0; i <index; i++) { endArray[i ] = endArray[i+ 1]; } endArray[index] = target; ShowArrayValues(endArray); // int low=0, mid, high=num; } /// <summary> /// 显示数组的数据 /// </summary> /// <param name="values"></param> static void ShowArrayValues(int[] values) { foreach (int item in values) { Console.Write(item + " "); } } /// <summary> /// 从小到大排序 /// </summary> /// <param name="i"></param> /// <returns></returns> private static int[] Sort(int[] i) { List<int> list = i.ToList(); list.Sort(); i= list.ToArray<int>(); return i; } } }