插入排序思想:每一步將一個待排序的元素,按期排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,知道元素插完。
插入排序分爲直接插入排序,和優化後的二分插入排序,我們先看第一種;
void InsertSort(int* arr, int _size) { if (arr == NULL || _size <= 0) return; for (int idx = 1; idx < _size; ++idx) { int end = idx - 1; //end爲插入之前最後一個節點的下標 while (end >= 0 && arr[end] > arr[end + 1]) { int tmp = arr[end + 1];//保存待插入的結點 arr[end + 1] = arr[end];//將待插入結點之前的元素後移 arr[end] = tmp;//插入待插入結點 end--; } } }
二分插入排序
基本思想:在直接插入排序的基礎上進行優化,因爲待插入元素之前的元素已經有序,我們沒必要每個都遍歷,藉助而二分法的思想可以有效降低查找的時間。
void BinaryInsertSort(int *arr, int size) { if (arr == NULL || size <= 0) return ; int index = 0; for (int idx = 1; idx < size; ++idx) { int tmp = arr[idx];//保存待插入元素 int left = 0; int right = idx - 1; int mid = (left&right) + ((left^right) >> 1); //二分法查找插入位置 while (left <= right) { if (tmp < arr[mid]) { right = mid - 1; index = mid;//更新插入位置 } else if (tmp >= arr[mid]) { left = mid + 1; index = mid + 1;//更新插入位置 } mid = (left&right) + ((left^right) >> 1);//縮小空間 } //後移元素 for (int j = idx; j > index; j--) { arr[j] = arr[j - 1]; } //插入新元素 arr[index] = tmp; } }
下個排序算法—>希爾排序