日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【排序】折半插入排序

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【排序】折半插入排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

折半插入排序原理

折半插入排序圖文說明

代碼實現

C實現

?JAVA實現

?復雜度分析和穩定性

復雜度

穩定性

總結


折半插入排序原理

折半插入排序是對直接插入排序的一種改良方式,在直接插入排序中,每次向已排序序列中插入元素時,都要去尋找插入元素的合適位置,但是這個過程是從已排序序列的最后開始逐一去比較大小的,這其實很是浪費,因為每比較一次緊接著就是元素的移動。折半排序就是通過折半的方式去找到合適的位置,然后一次性進行移動,為插入的元素騰出位置。什么是折半的方式去找合適的位置呢,那就是折半查找了,因為再已排序的序列中,序列元素都是按照順序排列的,既然這樣,完全不需要逐一去比較大小,而是去比較已排序序列的中位數,這個中間的位置將一排序列分為左右兩部分,通過一次比較后,就縮小了比較的范圍,重復這樣的操作,需要插入的元素就找到了合適的位置了。

折半插入排序圖文說明

注:藍色代表已排序序列,白色代表未排序序列,紅色箭頭指向未排序序列的第一個元素位置。

?

如圖所示,現在有一個待排序序列[8 5 4 2 3],首先默認初始狀態下,位置0的數字8作為已排序序列[8],位置1--位置4的[5 4 2 3 1]?為待排序序列,之后就逐一從[5 4 2 3 1]中取出數字向前進行比較,插入到已排序序列的合適位置。尋找過程中將藍色的已排序區域不斷進行折半。

初始狀態下,已排序區只有一個數據元素8,low位置和high位置都指向了該位置,mid為中間位置,此時很顯然也是0位(0+0)/ 2。此時temp < mid,將high指向mid的前一位,這里也就是-1,這個時候high=-1low=1,很顯然high<low,每當這個時候,就到了移動元素的時候了,將(high+1)(i-1)的元素都向后移一位,再把(high+1)位置上插入要插入的元素。

之后的操作也是這樣類似的,詳細過程如下圖。

?

代碼實現

C實現

代碼:

#include <stdio.h>void insertSort(int array[], int n){int temp;for(int i = 1; i < n; i++){int low = 0;int hight = i-1;temp = array[i];while(hight>=low){int mid = ( low + hight ) / 2;if (array[mid] > temp){hight = mid - 1;}else{low = mid + 1;}}for (int j = i-1; j > hight; j--) {array[j+1] = array[j];}array[hight+1] = temp;} }void main(){int i;int a[8] = { 8, 5, 4, 3, 2, 1, 6, 7 };printf("before:{");for(i = 0; i < 8; i++){printf("%d ",a[i]);}printf("}\n");insertSort(a,8);printf("after:{");for(i = 0; i < 8; i++){printf("%d ",a[i]);}printf("}\n");}

測試結果:?

?JAVA實現

代碼:

/*** Created by GFC on 2018/8/29.*/ public class HalfSearchSort {public void sort(int[] array){int temp;for(int i = 1; i < array.length; i++){int low = 0;int hight = i-1;temp = array[i];while(hight>=low){int mid = ( low + hight ) / 2;if (array[mid] > temp){hight = mid - 1;}else{low = mid + 1;}}for (int j = i-1; j > hight; j--) {array[j+1] = array[j];}array[hight+1] = temp;}}public static void main(String[] args) {HalfSearchSort sort = new HalfSearchSort();int a[] = {8, 5, 4, 3, 2, 1, 6, 7};System.out.println("Before: " + Arrays.toString(a));//System.out.println(5/2);sort.sort(a);System.out.println("After: " + Arrays.toString(a));} }

?測試結果

?復雜度分析和穩定性

復雜度

和直接插入排序相比較,折半插入排序僅僅是減少了比較的次數,而移動總次數并沒有發生改變。這個比較次數大概是,移動次數沒有改變,所以其復雜度和直接插入排序是一樣的。

穩定性

根據代碼分析可以知道,當待插入數與mid位置的值相等時,接下來相當于進入了有序序列的右半區,mid+1到high,之后經過多次折半查找,該元素所找到的合適位置就是前一個與之相等元素的后一位,所以說兩者相對位置沒有發生變化,這般插入排序是穩定的。

總結

折半插入排序其實是在直接插入排序的基礎上,結合了二分查找法的思想,順序的二分查找替代了直接插入排序中遍歷查找的過程,從而更快的能夠確定待插入元素的位置,但是由于移動次數并沒有發生改變,所以兩者的時間復雜度相同。折半插入排序是穩定的,其時間復雜度為。

?

總結

以上是生活随笔為你收集整理的【排序】折半插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。