二分插入排序(折半插入排序)--排序算法(六)
生活随笔
收集整理的這篇文章主要介紹了
二分插入排序(折半插入排序)--排序算法(六)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
折半插入排序思想
直接插入排序(Straight Insertion Sort)的基本思想是:
直接插入排序就像打牌抓牌一樣,手中的牌都是有序的,當(dāng)從下面拿起一張牌的時(shí)候,與手中的牌比較,然后插入到適當(dāng)位置。
折半插入(Binary Insert Sort)和直接插入類似,唯一的區(qū)別就是在有序列表中比較查找插入位置時(shí)用的是二分法。因?yàn)榍懊娌糠质怯行蛄斜?#xff0c;所以是最理想的二分法。
折半插入排序示例
下面選取折半插入排序的一個(gè)中間過(guò)程對(duì)其進(jìn)行說(shuō)明。假設(shè){20,30,40,10,60,50}中的前3個(gè)數(shù)已經(jīng)排列過(guò),是有序的了;接下來(lái)對(duì)10進(jìn)行排列。示意圖如下:
折半插入排序?qū)崿F(xiàn)
#include <stdio.h> void binaryInsert_sort(int *arr, int n){//i遍歷指針;j找到插入位,將插入為及其后面到達(dá)遍歷位的數(shù)后移//get每次從后面無(wú)序中拿到的數(shù)據(jù)//left前面有序的首指針,mid前面有序的中間指針,right前面有序的末尾指針int i, j, get, left, mid, right;for(i = 1; i < n; i++){get = arr[i]; //拿到要插入的值left = 0; right = i - 1;while(left <= right){ //前面有序部分的二分插入mid = (left + right)>>1; //每次取中值比較if(arr[mid] < get)left = mid + 1; //中值比插入數(shù)據(jù)說(shuō)明在左邊elseright = mid - 1; //反之在右邊}for(j = i - 1; j >= left; j--){ //找到插入位,將元素后移,騰出空間arr[j+1] = arr[j];}arr[left] = get; //插入} } void print(int *arr, int n){int i;for(i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n"); } int main(int argc, char const *argv[]) {int arr[6] = {20, 30, 40, 10, 60, 50};int n = sizeof(arr) / sizeof(int);binaryInsert_sort(arr, n);print(arr, n);return 0; }時(shí)間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性
- 時(shí)間復(fù)雜度:
二分插入排序的時(shí)間復(fù)雜度是O(N2):假設(shè)被排序的數(shù)列中有N個(gè)數(shù),遍歷一趟時(shí)間復(fù)雜度是O(N),需遍歷多少次呢?N-1次,共n-1 + n-2 + n-3 + … + 1 = n * (n -1) / 2.因此,其時(shí)間復(fù)雜度是O(N2)。
為什么二分查找還是O(N2)呢?因?yàn)椴还苁嵌植迦脒€是折半插入,大頭都在遍歷和元素的后移上,二分查找只能在查找位置上節(jié)約時(shí)間。 - 空間復(fù)雜度:
二分插入排序的空間復(fù)雜度是O(1),因?yàn)橐苿?dòng)元素是需要一個(gè)防止被覆蓋的臨時(shí)變量。 - 穩(wěn)定性:
二分插入排序是穩(wěn)定的算法,它滿足穩(wěn)定算法的定義:假設(shè)在數(shù)列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個(gè)排序算法是穩(wěn)定的!
總結(jié)
以上是生活随笔為你收集整理的二分插入排序(折半插入排序)--排序算法(六)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: selenium3 + python -
- 下一篇: c盘users的用户名怎么改_做完这几个