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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二分排序法

發布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分排序法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在我來簡單敘述一下二分法排序的思想,
1,從第0個元素開始用二分排序法遞歸產生有序序列
2,假設現在插入第i個元素,前面的0~i-1已經是有序的
3,設定left=0,i-1=right,
4,折半,用i元素跟[0~i-1]中間元素比,如果小,則進行前折半,否則進行后折半,直到left>right
5,把最終left與i-1之間的所有元素后移,再把第i個元素放在left位置上。
6,循環插入下一個元素,直到整個序列有序



/**
* 二分法排序<br>
* 根據排序原則,每次我們都是在一個有序序列中插入一個新的數字<br>
* 那么我們可以將這個有序序列進行二分。<br>
* 左游標left為0,右游標right為i-1(i是這個數字在原數組中的位置)<br>
* middle初始為。<br>
* 當left<=right時<br>
* middle是left和right的中值。<br>
* 我們作如下操作。如果array[i]的值比array[middle]值大。<br>
* 那么我們就移動左游標令值為middle+1<br>
* 負責就移動右游標為middle-1<br>
* 移動完成后,我們需要將i-1到left之間的值進行依次向后移動給array[i]空出一個位置然后將array[i]插入
* <p style="color:red">時間復雜度n</p>
*/
public int[] binaryInsertSort(int[] array){
for(int i = 0;i<array.length;i++){
int temp = array[i];//待插入到前面有序序列的值
int left = 0;//有序序列的左側
int right = i-1;//有序序列的右側
int middle = 0;//有序序列的中間
while(left <= right){
middle = (left + right)/2;//賦值
if(temp<array[middle]){
right = middle-1;
}else{
left = middle + 1;
}
}
for(int j = i-1;j>=left;j--){
//從i-1到left依次向后移動一位,等待temp值插入
array[j+1] = array[j];
}
if(left != i ){
array[left] = temp;
}
}
return array;
}




插入排序
對于未排序數據(右手抓到的牌),在已排序序列(左手已經排好序的手牌)中從后向前掃描,找到相應位置并插入。

插入排序與二分排序的區別
插入排序需要額外的空間存放有序序列,二分排序在原有的序列上排序

插入排序不適合對于數據量比較大的排序應用。但是,如果需要排序的數據量很小,比如量級小于千,那么插入排序還是一個不錯的選擇。 插入排序在工業級庫中也有著廣泛的應用,在STL的sort算法和stdlib的qsort算法中,都將插入排序作為快速排序的補充,用于少量元素的排序(通常為8個或以下)。

二分插入排序
如果比較操作的代價比交換操作大的話,結合插入排序和二分排序,采用二分查找法來減少比較操作的次數,我們稱為二分插入排序

總結

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

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