基本概念:
將未排序序列通過向有序序列從後向前掃瞄,找到合適的位置插入到有序序列裡。
基本步驟:
從第二個元素開始。(第乙個元素預設為是有序序列)
取出下乙個元素,在已排序序列中從後向前掃瞄
該元素大於新元素就往後移動
重複3步驟
找到合適的位置,將新元素插入對應位置
重複1-5
例如:int arrays = ;
有序序列:2,未排序序列 3,9,17,4,0,7,8
取出3,掃瞄有序序列 2,比較 3->2,3比2大,放在2,之後。
取出9,與3比較,比3大,放在3之後
取出17,與9比較,比9大,放在9之後
取出4,與17比較,比17小,將17往後移動一位
與9比較,比9小,將9往後移動一位
與3比較,比3大,將4插入3之後
……重複以上步驟………
**實現:
/**
* 插入排序 :將未排序序列的元素逐一和有序序列比較,並插入到有序序列中,預設第乙個是有序序列
* @param array
* @return
*/private static int insertsort(int array)
// 插入新元素
array[j] = newelement; // c5:n-1
}return array;
}
時間複雜度:
最好的情況是正序有序時,只需要比較一遍,而不需要移動元素。執行n次。
最壞的情況是逆序,需要比較一遍且每個元素都需要移動一次。
插入排序的時間複雜度是o(n^2).
基本概念:
將陣列折半查詢,比較需要查詢值與中間值比較,迴圈縮小查詢範圍,知道 找到最終資料。
/**
* 二分法查詢: 將陣列分成兩半,在其中一半比較需要查詢的資料,依次縮小查詢範圍,知道找到需要的值
* @param arrary
* @param findvalue
* @return
*/// 非遞迴方式
private static int binarysearch(int array,int findvalue)else if(array[mid] > findvalue)else
}return -1;
}// 遞迴方式
private static int binarysearch2(int arrary,int findvalue,int left,int right)else if (findvalue < arrary[mid])else
return -1;
}
時間複雜度:logn.
插入排序是迴圈將未排序序列插入到排序序列中,在排序序列中使用二分法查詢需插入的位置會比較快。
**實現:
/**
* 通過二分法查詢進行插入排序,主要對有序序列進行二分法查詢到插入的位置
* @param array
* @return
*/private static int insertsortbybinary(int array)
// 插入元素
array[left] = newelement;
}return array;
}
測試**:private static int testarr = new int[500];
public static void main(string agrs)
system.out.println();
long starttime = system.currenttimemillis();
int ints = selectsort(testarr);
long endtime = system.currenttimemillis();
sprintresult(ints);
system.out.println();
long starttime1 = system.currenttimemillis();
int insertsort = insertsort2(testarr);
long endtime1 = system.currenttimemillis();
sprintresult(insertsort);
system.out.println();
long starttime2 = system.currenttimemillis();
int insertsort1 = insertbybinarysort(testarr);
long endtime2 = system.currenttimemillis();
sprintresult(insertsort1);
} private static void sprintresult(int ints)
}
基本概念:
預設第乙個元素是已排序並最小(大)元素,在剩餘元素中查詢最小(大)的元素,與第乙個交換位置;
在剩餘的元素中查詢最小(大)的元素,與已經排好序的第二個元素交換位置;
重複以上步驟;
**實現:
/**
* 選擇排序:預設第乙個是最小的,查詢剩餘的最小的元素,交換進行排序,重複以上步驟
* @param array
* @return
*/private static int selectsort(int array)
}// 交換位置,可以在這裡控制是否是穩定排序
if(i!=min)
}return array;
}
時間複雜度:
最好的情況是正序時,不需要交換位置,但是每次都需要查詢一遍最小元素,時間複雜度o(n^2);
最壞的情況是逆序是,不但每次需要查詢最小元素的位置還需要作出交換,時間複雜度o(n^2);
結論:但需排序的資料量越大,二分法插入排序與直接插入排序時間差更明顯。
當資料量大時,選擇排序遠比插入排序耗時。
時間精準到ms。不考慮小數點。
資料量直接插入排序耗時
二分法插入排序耗時
選擇排序耗時
1000
00ms
1000
3ms0ms
4ms10000
12ms
5ms57ms
拆分為合併兩個有序陣列,再將合併好的有序陣列與其他陣列合併。
/**
* 合併2個有序陣列,
* 1、先合併兩個,然後將合併好的陣列與第三個合併,然後與第四個合併
* 2、可以使用二維陣列;之後使用
* 3、將a1和a2的每個元素進行比較,小的放進新陣列裡
* 4、將剩餘的每合併完的陣列拷貝到新陣列(因為是有序陣列,之前也比較過,剩餘的都是可以直接拷貝,順序不會發生變化)
*/ private static int mergersorted(int a1,int a2);
int a2 = ;
int a3 = ;
int a4 = ;
int merge = mergefour(a1,a2,a3,a4);
system.out.println();
sprintresult(hebin);
測試結果:
排序後: 1 2 4 5 5 7 7 8 8 9 9 9 10 11 11 12 14 15 16 20
二分法查詢有序陣列
package array public class testbinarysearch 指定查詢的元素 int num 12 用二分法查詢,返回索引 int start 0 int end arr.length 1 end的設定應該為陣列最後一位 int index 1 用於標誌是否查詢到指定元素 ...
查詢有序陣列元素 二分法
查詢的方法多種多樣,今天提到的就是對於乙個有序陣列而言最方便最高效率的方法 二分法,也叫折半查詢。具體 如下 二分法,也叫折半查詢 include include intb search int a,int left,int right,int k else if a mid k else retu...
有序陣列中二分法查詢
二分法查詢適用於資料量較大時,但是資料需要先排好順序。首先,從陣列的中間元素開始搜尋,如果該元素正好是目標元素,則搜尋過程結束,否則執行下一步。如果目標元素大於 小於中間元素,則在陣列大於 小於中間元素的那一半區域查詢,然後重複步驟1的操作。如果某一步陣列為空,則表示找不到目標元素。時間複雜度為 o...