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