排序演算法和查詢演算法總結

2021-09-23 23:48:02 字數 4205 閱讀 3566

1.氣泡排序

解釋:​ 所謂氣泡排序,就是如同水裡的泡泡一樣,將合適的值一次次往上冒,直到所有資料全部處理完成。

在資料中的解釋就是:從第乙個數開始,每次都將前乙個數與後乙個數作比較,如果前乙個數大於後乙個數,則將兩者交換位置(否則不交換),此時,後乙個數值已變化,然後再將後乙個數與後後乙個數作比較,重複操作,直到所有的數都比較完成。

演算法過程:

​ 先定義乙個外迴圈,控制整個排序次數(排序次數為資料的個數),然後再內嵌乙個內迴圈,在內迴圈中進行每次排序的比較,內迴圈的比較次數為:資料個數-當前排序次數,因為,比如說,在第一次比較時,比較得出的結果一定是資料中的最大值,併排在最後,此時,最大值已知,不用再進行比較了,以此類推,每次都會減少一次比較。

時間複雜度:

​ 第一次迴圈n,第二次迴圈n,綜合為o(n^2)。

演算法實現:

public

class

test1

;//下面進行氣泡排序

for(

int i =

0;i < nums.length-

2;i++)}

}for

(int x : nums)

}}

2.選擇排序

解釋:​ 所謂選擇排序,就是每次選擇出當前比較資料的最小值,然後將其傳遞到資料的前面。

演算法過程:

​ 第一步:定義乙個外層迴圈,控制排序次數,迴圈次數為資料個數-1。

​ 第二步:定義乙個變數k,這個變數等於外層迴圈的次數的起始值 i ,目的是存放當前需要操作的資料的第乙個數,以便與後面的數比較。

​ 第三步:定義乙個內層迴圈,這個內層迴圈代表著當前需要比較的次數,起始值為k+1,因為k是當前資料的第乙個位置,不需要讓自己比自己,結束位置為資料末端,即資料的長度。

​ 第四步:將k位置的數與資料比較,如果比較的數小於k位置的數,則將這個索引賦給k,以此類推,最後每次比較結束都會找到當前資料的最小值。

​ 第五步,將第i的位置的資料與k的資料交換,即將最小值放到前面。

​ 第六步:再次操作以上步驟,直到資料全部完成。

時間複雜度:

​ o(n^2)

演算法實現:

public

class

test1

}//上述得出當前比較資料的最小值

//下方較當前的最小值,與當前比較資料的開頭資料進行互動,最小值將會傳遞到開始的位置,這個數及位置將不會參與下次比較

int temp = nums[i]

;

nums[i]

= nums[k]

; nums[k]

= temp;}}

public

static

void

main

(string[

] args)

;selectsort01

(nums)

;for

(int x : nums)

}}

3.插入排序

解釋:​ 所謂插入排序,就是將後面的數與前面的數比較,如果後面的數小於前面的數,就將後面的數插入到前面的數的前面。

演算法過程:

​ 所謂插入排序,就是從第二個數開始,依次向前比較,如果前面乙個數小於這個數,那麼就將前面乙個數右移,將前面乙個數的位置賦空(看了**就明白),然後再比較這個數與前前乙個數,如果前前乙個數大於這個數,則將這個前前的數賦給這個空位置,前前乙個數的原位置則就代表了空,重複以上操作,最後將空位置補上當前操作的數即可,直到全部比較完成。

時間複雜度:

​ o(n^2);

**實現:

public

static

void

insertsort

(int

nums)

nums[j]

= target;}}

public

static

void

main

(string[

] args)

;insertsort

(nums)

;for

(int num : nums)

}}

4.快速排序

解釋:​ 乙個效率極其高的排序演算法。

演算法過程:

​ 先設定乙個基準(一般為陣列最左邊的數)。乙個從左往右開始檢索的起始索引,乙個從右往左開始檢索的起始索引(如果左索引大於有索引,則被認定為不合法,無需進行一下操作,須提前判斷)。

​ 然後先從陣列右邊開始向左邊檢索,直到檢索的數小於基準(前提是該索引不能小於左邊的索引),即先暫停,取出這個位置的索引 j。

​ 然後再從左往右檢索,直到檢索的數大於基準(前提是該索引不能大於當前右邊的索引),即先暫停。取出這個位置的索引 i。

​ 交換兩個索引位置的數。(在兩種索引不相等的前提下,繼續迴圈上述操作)。

​ 當兩個索引相遇時,此時索引右邊的數就是全部大於基準的數,索引左邊的數就是全部小於基準的數。

​ 然後將相遇索引位置的數與基準交換。

​ 然後分別遞迴相遇索引右邊的陣列和左邊的陣列(不含索引)

​ 最終排序成功。

時間複雜度:

​ o(nlogn);

注意問題:

​ 每次檢索時,必須先從右邊開始檢索,因為j在變,i < j始終需要成立。當然還得根據具體情況而定,這是個注意點。

**實現:

public

static

void

quicksort

(int

arr,

int left,

int right)

int base = arr[left]

;//設定基準,一般為最左邊的數

int i = left;

//設定從左往右檢索角標的實時位置

int j = right;

//設定從有往左檢索角標的實時位置

while

(i != j)

//從左往右檢索比基準大的數,找到即先停下

while

(arr[i]

<= base && i < j)

//通過上述兩個迴圈必定找到指定數,然後將兩個數交換

int temp = arr[j]

; arr[j]

= arr[i]

; arr[i]

= temp;

}//上述迴圈結束代表i==j了,即兩個角標重合

//此時將基準與重合位置的數交換

arr[left]

= arr[i]

; arr[i]

= base;

//遞迴繼續執行上述操作

//遞迴排序左邊的數

quicksort

(arr, left, i -1)

;//遞迴排序有邊的數

quicksort

(arr, i+

1, right)

;}

1.二分查詢(折半查詢)

解釋:​ 在乙個事先排好序的陣列中,查詢乙個數所在的索引位置。

演算法過程:

​ *提前準備:

​ 定義乙個方法,設定兩個引數,第乙個為排好序的陣列,第二個為需要查詢的數。在方法內部定義三個變數,分別為top(代表每次查詢部分的第乙個數的索引),bottom(代表每次查詢部分的最後乙個數的索引),mid(代表每次查詢部分的中間位置的數,mid=(top+bottom)/2)。

​ *過程:

​ 首判斷我們每次執行後的top和bottom是否不在同一位置,如果不在,則代表全部查完了也沒找到,此時須返回查詢失敗標誌,反之,代表還有數可查,繼續查詢。

​ 每次查詢的時候mid都會變成當前查詢部分的中間值索引,然後判斷該中間值是否與查詢的數相等,若相等,則返回該中間值索引,查詢成功。否則,判斷,該中間值是大於查詢值還是小於查詢值。如果大於查詢值,則代表查詢的值一定在中間值索引的左邊,否則,在其右邊。此時,目標陣列就會變成需要查詢的部分,然後改變top和bottom及mid到對應的新值。重複執行以上過程,直到查詢成功或失敗。

**實現:

public

static

intsearch

(int

nums,

int num)

else

if(num < nums[mid]

)else

}return-1

;//查詢失敗返回值

}

排序和查詢演算法總結

一 排序演算法總結 1 插入排序 直接插入排序,希爾排序 2 交換排序 氣泡排序,快速排序 3 選擇排序 直接選擇排序,堆排序 4 歸併排序 5 桶排序 空桶排序法,非常耗空間,需要指定max arr i 1個空桶 規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶...

查詢演算法和排序演算法的歸納總結

查詢演算法 有序查詢 時間複雜度 o n 二分查詢 時間複雜度 o logn 有序查詢演算法實現 public int search int searcher 二分查詢演算法實現 public int binary search int searcher return 1 排序演算法 氣泡排序 時間...

排序演算法和查詢演算法

法是用來解決常見問題的方法 同乙個問題可以採用多種方法解決,不同 方法適用於不同的環境 排序指的是把一組數字按照某種順序排列好 排序演算法分很多次重複執行,每次負責把 乙個數字放在合適的位置上 為了實現以上效果可以先確定數字然後查詢 位置也可以先確定位置然後查詢數字 通過不斷調整兩個數字的相互順序最...