折半插入排序

 1         /// <summary>
 2         /// 折半插入排序
 3         /// </summary>
 4         /// <param name="arr"></param>
 5         /// <returns></returns>
 6         public static int[] HalfInsertSort(int[] arr)
 7         {
 8             for (int i = 1; i < arr.Length; i++)
 9             {
10                 if (arr[i] >= arr[i - 1])
11                     continue;
12                 int low = 0;
13                 int high = i - 1; 
14                 int temp = arr[i];
15                 int j = i;
16 
17                 //二分法查找插入点
18                 while (low <= high)
19                 {
20                     int mid = (low + high) / 2; //中点在low
21                     if (temp > arr[mid])
22                         low = mid + 1;
23                     else if (temp < arr[mid])
24                         high = mid - 1;
25                     else
26                         break;
27                 }
28 
29                 //移动位置
30                 while(j > low)  //low == high,arr[low]即为插入点
31                 {
32                     arr[j] = arr[j - 1];
33                     --j;
34                 }
35                 arr[j] = temp;
36             }
37             return arr;
38         }
工欲善其事,必先利其器。
原文地址:https://www.cnblogs.com/zhangzhu/p/2836115.html