在有序序列中插入一个元素,保持序列有序,有序长度不断增加。
直接插入排序
直接插入排序:采用顺序查找法查找插入位置。
- 原始数据越接近有序,排序速度越快。
- 时间复杂度=O(n2),空间复杂度=O(1)。稳定排序。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| internal class Program { private static void Main(string[] args) { int[] arr = { 5, 7, 3, 8, 6, 9 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); insert_sort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } }
private static void insert_sort(int[] arr) { int length = arr.Length; for (int i = 1; i < length; i++) { int insert_elem = arr[i]; int position = i; while (position > 0 && arr[position - 1] > insert_elem) { arr[position] = arr[position - 1]; position--; } if (position != i) { arr[position] = insert_elem; } } } private static void insert_sort1(int[] arr) { int i, j; int length = arr.Length; for (i = 1; i < length; i++) { int temp = arr[i]; for (j = i - 1; j >= 0 && arr[j] > temp; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = temp; } } }
|
输出:
未排序前的数组:
5 7 3 8 6 9
排序后的数组:
3 5 6 7 8 9
折半插入排序
折半插入排序:减少比较次数,但没有减少移动次数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| internal class Program { private static void Main(string[] args) { int[] arr = { 5, 7, 3, 8, 6, 9 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); half_sort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } }
private static void half_sort(int[] arr) { int temp, low, high, mid; for (int i = 1; i < arr.Length; i++) { low = 0; high = i - 1; temp = arr[i]; while (low <= high) { mid = low + (high - low) / 2; if (arr[mid] > temp) { high = mid - 1; } else { low = mid + 1; } } for (int j = i - 1; j >= high + 1; j--) { arr[j + 1] = arr[j]; } arr[high + 1] = temp; } } }
|
输出:
未排序前的数组:
5 7 3 8 6 9
排序后的数组:
3 5 6 7 8 9
希尔排序
希尔排序:先将整个代排序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录基本有序
时,再对全体记录进行一次直接插入排序。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| internal class Program { private static void Main(string[] args) { int[] arr = { 5, 7, 3, 8, 6, 9 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); shell_sort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } } private static void shell_sort(int[] arr) { int length = arr.Length; int interval = 1; while (interval < length / 3) { interval = interval * 3 + 1; } while (interval > 0) { int i, j, temp; for (i = interval; i < length; i++) { temp = arr[i]; j = i; while (j > interval - 1 && arr[j - interval] >= temp) { arr[j] = arr[j - interval]; j -= interval; } if (j != i) { arr[j] = temp; } } interval = (interval - 1) / 3; } } }
|
输出:
未排序前的数组:
5 7 3 8 6 9
排序后的数组:
3 5 6 7 8 9