插入排序的基本原理
插入排序就是是对于一对原本有顺序的数组,将没有顺序的数组插入到有序的数组里面去。
这里呢,我们默认将要排序的数组靠前的数是有序的【就认为第一个数所组成的是有序的】
这里就是只有一个数,然后将后面的数和前面的数进行比较,如果比前面的数小,就和前面的数进行交换
这个有点像倒着的冒泡排序
就是第一个数字有序,然后从第二个数字开始和前面比较
单个数组的例子
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
| #include <stdio.h>
void exchange(int a[], int i, int j)
{ int temp = a[i]; a[i] = a[j]; a[j] = temp; }
void print(int a[], int sz) { for (int i = 0; i < sz; i++) { printf("%d", a[i]); } }
int main() { int a[] = { 1,5,3,6,9,8,7,2,4 };
for (int i = 1; i < sizeof(a) / sizeof(a[0]); i++) { for (int j = i; j > 0; j--) { if (a[j] < a[j - 1]) { exchange(a, j, j - 1); } } } int sz = sizeof(a) / sizeof(a[0]); print(a, sz); }
|
偷一张图:
俩个数组的例子
原理是:
第一个有序的数组不变。
通过length来选取第一个数组中的元素,然后将无需数组的元素一个一个的放入有序数组后面,然后重新排序。
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
| #include <stdio.h>
void insertionSort(int arr[], int n) { int i, key, j; for (i = 1; i < n; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } }
int main() { int sortedArr[] = {2, 4, 6, 8, 10}; int unsortedArr[] = {9, 7, 5, 3, 1}; int sortedLength = sizeof(sortedArr) / sizeof(sortedArr[0]); int unsortedLength = sizeof(unsortedArr) / sizeof(unsortedArr[0]); for (int i = 0; i < unsortedLength; i++) { sortedArr[] = unsortedArr[i]; sortedLength++; insertionSort(sortedArr, sortedLength); } printf("排序后的数组:"); for (int i = 0; i < sortedLength; i++) { printf("%d ", sortedArr[i]); } return 0; }
|