插入排序 二分法查詢 合併有序陣列 選擇排序

2021-09-24 21:25:00 字數 3808 閱讀 4918

基本概念:

將未排序序列通過向有序序列從後向前掃瞄,找到合適的位置插入到有序序列裡。

基本步驟:

從第二個元素開始。(第乙個元素預設為是有序序列)

取出下乙個元素,在已排序序列中從後向前掃瞄

該元素大於新元素就往後移動

重複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...