二分排序
接觸到二分排序是在看二叉樹的資料里,又看到了二分排序。
產(chǎn)生了好奇心,所以就決定先理解二分排序,以下是代碼 ,按照我的理解對其進行了分塊注釋。
最后,對和我一樣第一次看算法的,我更建議先去看懂二分查找,那二分排序就很簡單了。
public class Main {public static void main(String[] args) {int[] a = { 2, 5, 6, 9, 7, 4, 3 };int i, j;int left, right, mid;int temp;for (i = 1; i < a.length; i++) {/* 找到數(shù)組中第一個無序的數(shù),保存為temp */if (a[i] < a[i - 1]) {temp = a[i];} else {continue;}/* 找到數(shù)組中第一個無序的數(shù),保存為temp *//* 二分查詢開始 */left = 0;right = i - 1;while (left <= right) {mid = (left + right) / 2;if (a[mid] > temp) {right = mid - 1;} else {left = mid + 1;}}/* 二分查詢結束,此時a[left]>=a[i],記錄下left的值 *//* 將有序數(shù)組中比要插入的數(shù)大的數(shù)右移 */for (j = i; j > left; j--) {a[j] = a[j - 1];}/* 將有序數(shù)組中比要插入的數(shù)大的數(shù)右移 */// 將left位置賦值為要插入的數(shù)a[left] = temp;}for (int v = 0; v < a.length; v++) {System.out.print(a[v] + " ");}} }大致講一下我的理解吧,希望能幫助到后面的人。
大致思路是
一個無序數(shù)組,一定是有序然后無序,找到無序的第一個數(shù)
將該數(shù)插入前面的有序數(shù)組中,對后面的數(shù)依次循環(huán)插入前面的有序數(shù)組,完成排序。
具體實現(xiàn)是
1.找到有序數(shù)組后面第一個數(shù)記為temp,記下數(shù)組坐標i
2.二分查找找到有序數(shù)組中比temp大的數(shù),記下下標left
3.把有序數(shù)組中所有比temp大的數(shù)右移一位,從a[i]=a[i-1]一直到a[left+1]=a[left]
4.a[left]=temp
簡單的舉例為
最開始數(shù)組:2,5,6,9? ?7,4,3??
第一次插入:2,5,6,7,9,? ?4,3
第二次插入:2,4,5,6,7,9? ?3
第三次插入:2,3,4,5,6,7,9
很容易看出,這只是一個插入的方法,甚至可以說,二分排序僅僅是二分查找+插入的組成。
總結
- 上一篇: nexus下载安装和创建maven私库
- 下一篇: 用了30天整理的一些GO语言学习资料,2