Java 各種基礎的查詢和排序演算法總結

2021-06-27 09:30:31 字數 4089 閱讀 1582

查詢方法:

1.順序查詢。

按陣列的順序從前往後一直比較,直到找到目標值返回。

優點:對陣列的結構沒有特定的要求,演算法簡單。

缺點:當陣列個數n較大時,效率低下。

時間複雜度:最大時間複雜度是o(n),最小時間複雜度是o(1),平均時間複雜度是o(n/2).

/**

* 順序查詢演算法

* * @param array

* 陣列

* @param target

* 目標

* @return 找到,返回下標值;找不到返回0x80000000

*/public int sequentialsearch(int array, int target)

if (array.length <= 0)

for (int index = 0; index < array.length - 1; index++)

} return integer.min_value;

}

2.二分查詢:

從陣列的中間開始查詢,若找到目標值則返回;若目標值比中間數小則遞迴查詢前半部分;若目標值比中間數大則遞迴查詢後半部分。

優點:比較次數較少,效率比較高

缺點:只適用於不經常變動有序陣列

時間複雜度:o(log(n))

/**

* 二分查詢演算法

* @param array 有序陣列

* @param target 目標數值

* @return 找到,返回下標值;找不到返回0x80000000

*/public int binarysearch(int array, int target)

if (array.length <= 0)

int low = 0;

int high = array.length - 1;

while (low <= high)

if (target > array[middle]) else

} return integer.min_value;

}

排序方法:

1.插入排序:

將乙個資料插入到已經排好序的有序資料中,在有序序列中選出合適的位置插入,從而得到乙個新的、個數加一的有序資料。

優點:是穩定的排序方法。

缺點:演算法適用於少量資料的排序

時間複雜度為o(n^2)。

public int insertsort(int array) 

if (array.length <= 0)

for (int i = 0; i < array.length - 1; i++)

array[index] = temp;

}} return array;

} private int halffindindex(int array, int target, int end) else

} if (target > array[middle])

return middle;

}

2.氣泡排序

每次將相鄰的兩個數進行比較,如果想公升序,則大數往後,反之亦然。

優點:演算法簡單,穩定演算法

缺點:效率低下的排序方法,在資料規模很小時,可以採用;

時間複雜度:無序o(n^2),有序o(1)

public int bubblesort(int array) 

if (array.length <= 0)

int flag = array.length - 1;

while (flag > 0)

}} return array;

}

3.歸併排序

採用分治的思想,通過分割和合併,達到目的

優點:演算法簡單,穩定演算法

平均時間複雜度:o(nlog2n)

空間複雜度:o(n)  (用於儲存有序子串行合併後有序序列)

/**

* 歸併排序

* * @param unsortarray

* @return

* @throws nullpointerexception

* @throws illegalargumentexception

*/public int mergersort(int unsortarray) throws nullpointerexception,

illegalargumentexception

if (unsortarray.length <= 0)

int last = unsortarray.length - 1;

int temp = new int[unsortarray.length];

return merger(unsortarray, 0, last, temp);

} /**

* 遞迴實現歸併排序

* * @param unsortarray

* 無序陣列

* @param first

* 開始下標

* @param last

* 最後有效下標

*/private int merger(int unsortarray, int first, int last, int temp)

if (first < last)

return unsortarray;

} /**

* 將兩個有序序列合併成乙個有序序列

* * @param array

* 乙個無序序列

* @param first

* 開始的座標

* @param last

* 最後的座標

* @param temp

* 暫存陣列

*/private void mergerarray(int array, int first, int mid, int last,

int temp) else

} while (start <= mid)

while (latterindex <= last)

for (int i = 0; i < tempindex; i++)

}

4.快速排序

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

是不穩定的演算法

快速排序時間複雜度下界為o(nlgn),最壞情況為o(n^2)。在實際應用中,快速排序的平均時間複雜度為o(nlgn)

只要對快速排序做簡單的操作,就能使時間複雜度總是o(nlgn):

1.對排序資料進行打亂;

2.隨機挑選基準數.

額外空間o(log(n))

public int quicksort(int unsortarray, int left, int right)

throws nullpointerexception, illegalargumentexception

if (unsortarray.length <= 0)

if (left < right)

if (start < end)

while (start < end && x > unsortarray[start])

if (start < end)

}unsortarray[start] = x;

quicksort(unsortarray, left, start - 1); // 遞迴呼叫

quicksort(unsortarray, start + 1, right);

} return unsortarray;

}

各種排序演算法和查詢演算法

自己實現了一遍氣泡排序 選擇排序 插入排序,留個念想 氣泡排序 簡單來說就是從陣列末端冒泡到陣列當前位置 void bubblesort unsigned char data,unsigned short length 選擇排序 當前位置之後的所有數跟當前位置的數比較,得到最小的數到當前位置 voi...

各種排序和查詢複雜度

排序方法 平均情況 最好情況 最壞情況 輔助空間 穩定性 氣泡排序 o n 2 o n o n 2 o 1 穩定 選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 插入排序 o n 2 o n o n 2 o 1 穩定 希爾排序o n log n o n 2 o n 1.3 o n 2 ...

各種排序和查詢複雜度

排序方法 平均情況 最好情況 最壞情況 輔助空間 穩定性 氣泡排序 o n 2 o n o n 2 o 1 穩定 選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 插入排序 o n 2 o n o n 2 o 1 穩定 希爾排序o n log n o n 2 o n 1.3 o n 2 ...