排序演算法1--插入排序
阿新 • • 發佈:2018-11-09
插入排序思想:每一步將一個待排序的元素,按期排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,知道元素插完。
插入排序分為直接插入排序,和優化後的二分插入排序,我們先看第一種;
直接插入排序
- 基本思想:當我們插入第i(i>=1)個元素時,前面的所有元素已經排好序,此時我們使用當前元素從後向前比較,直到找到一個小於array[i]的節點(若沒有,則插在陣列下標為0的地方),從下一個節點順序後移,將array[i]插入進來。
- 時間複雜度: O(n^2)
- 空間複雜度: O(1)
- 穩 定 性 :穩定
- 適用場景:1.資料量較小;2.基本接近有序
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;
}
}
下個排序演算法—>希爾排序