成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

java常用的7大排序算法匯總

移動開發 算法
插入排序的基本思想是在遍歷數組的過程中,假設在序號 i 之前的元素即 [0..i-1] 都已經排好序,本趟需要找到 i 對應的元素 x 的正確位置 k ,并且在尋找這個位置 k 的過程中逐個將比較過的元素往后移一位,為元素 x “騰位置”,最后將 k 對應的元素值賦為 x ,一般情況下,插入排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1)。

這段時間閑了下來,就抽了點時間總結了下java中常用的七大排序算法,希望以后可以回顧!

 

1.插入排序算法

 

插入排序的基本思想是在遍歷數組的過程中,假設在序號 i 之前的元素即 [0..i-1] 都已經排好序,本趟需要找到 i 對應的元素 x 的正確位置 k ,并且在尋找這個位置 k 的過程中逐個將比較過的元素往后移一位,為元素 x “騰位置”,***將 k 對應的元素值賦為 x ,一般情況下,插入排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1)。

 

 

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5.  
  6. public int[] sortInsert(int[] array){ 
  7. for(int i=1;i<array.length;i++){ 
  8. int temp = array[i]; 
  9. int j; 
  10. for(j=i-1;j >= 0 && temp< array[j]; j--){ 
  11. array[j + 1] = array[j]; 
  12. array[j + 1] = temp; 
  13. return array; 

2.選擇排序算法

選擇排序的基本思想是遍歷數組的過程中,以 i 代表當前需要排序的序號,則需要在剩余的 [i…n-1] 中找出其中的最小值,然后將找到的最小值與 i 指向的值進行交換。因為每一趟確定元素的過程中都會有一個選擇***值的子流程,所以人們形象地稱之為選擇排序。選擇排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1) 。

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5.  
  6. public int[] sortSelect(int[] arr){ 
  7. for (int i = 0; i < arr.length; i++) { 
  8. int miniPost = i; 
  9. for (int m = i + 1; m < arr.length; m++) { 
  10. if (arr[m] < arr[miniPost]) { 
  11. miniPost = m; 
  12.  
  13. if (arr[i] > arr[miniPost]) { 
  14. int temp; 
  15. temp = arr[i]; 
  16. arr[i] = arr[miniPost]; 
  17. arr[miniPost] = temp; 
  18. return arr; 

3.冒泡排序算法

冒泡排序是將比較大的數字沉在最下面,較小的浮在上面

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5.  
  6. public int[] sortBubble(int[] array){ 
  7. int temp; 
  8. // ***層循環:表明比較的次數, 比如 length 個元素,比較次數為 length-1 次(肯定不需和自己比) 
  9. for(int i=0;i<array.length-1;i++){ 
  10. for (int j = array.length - 1; j > i; j--) { 
  11. if (array[j] < array[j - 1]) { 
  12. temp = array[j]; 
  13. array[j] = array[j - 1]; 
  14. array[j - 1] = temp; 
  15. return array; 

4.快速排序算法

通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,已達到整個序列有序的目的,本質就是,找一個基位(樞軸,分水嶺,作用是左邊的都比它小,右邊的都比它大.可隨機,取名base,首先從序列最右邊開始找比base小的,如果小,換位置,從而base移到剛才右邊(比較時比base小)的位置(記為臨時的high位),這樣base右邊的都比base大。然后,從序列的最左邊開始找比base大的,如果大,換位置,從而base移動到剛才左邊(比較時比base大)的位置(記為臨時的low位),這樣base左邊的都比base小,循環以上兩步,直到 low == heigh, 這使才真正的找到了樞軸,分水嶺. 返回這個位置,分水嶺左邊和右邊的序列,分別再來遞歸。

 

 

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5.  
  6. public int[] sortQuick(int[] array){ 
  7. return quickSort(array, 0, array.length-1); 
  8.  
  9. private int[] quickSort(int[] arr, int low, int heigh) { 
  10. if (low < heigh) { 
  11. int division = partition(arr, low, heigh); 
  12. quickSort(arr, low, division - 1); 
  13. quickSort(arr, division + 1, heigh); 
  14. return arr; 
  15.  
  16. // 分水嶺,基位,左邊的都比這個位置小,右邊的都大 
  17. private int partition(int[] arr, int low, int heigh) { 
  18. int base = arr[low]; //用子表的***個記錄做樞軸(分水嶺)記錄 
  19. while (low < heigh) { //從表的兩端交替向中間掃描 
  20. while (low < heigh && arr[heigh] >= base) { 
  21. heigh--; 
  22. // base 賦值給 當前 heigh 位,base 挪到(互換)到了這里,heigh位右邊的都比base大 
  23. swap(arr, heigh, low); 
  24. while (low < heigh && arr[low] <= base) { 
  25. low++; 
  26. // 遇到左邊比base值大的了,換位置 
  27. swap(arr, heigh, low); 
  28. // now low = heigh; 
  29. return low; 
  30.  
  31. private void swap(int[] arr, int a, int b) { 
  32. int temp; 
  33. temp = arr[a]; 
  34. arr[a] = arr[b]; 
  35. arr[b] = temp; 

5.合并排序算法

歸并排序采用的是遞歸來實現,屬于“分而治之”,將目標數組從中間一分為二,之后分別對這兩個數組進行排序,排序完畢之后再將排好序的兩個數組“歸并”到一起,歸并排序最重要的也就是這個“歸并”的過程,歸并的過程中需要額外的跟需要歸并的兩個數組長度一致的空間

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5. private int[] sort(int[] nums, int low, int high) { 
  6. int mid = (low + high) / 2
  7. if (low < high) { 
  8. // 左邊 
  9. sort(nums, low, mid); 
  10. // 右邊 
  11. sort(nums, mid + 1, high); 
  12. // 左右歸并 
  13. merge(nums, low, mid, high); 
  14. return nums; 
  15.  
  16. private void merge(int[] nums, int low, int mid, int high) { 
  17. int[] temp = new int[high - low + 1]; 
  18. int i = low;// 左指針 
  19. int j = mid + 1;// 右指針 
  20. int k = 0
  21. // 把較小的數先移到新數組中 
  22. while (i <= mid && j <= high) { 
  23. if (nums[i] < nums[j]) { 
  24. temp[k++] = nums[i++]; 
  25. else { 
  26. temp[k++] = nums[j++]; 
  27. // 把左邊剩余的數移入數組 
  28. while (i <= mid) { 
  29. temp[k++] = nums[i++]; 
  30. // 把右邊邊剩余的數移入數組 
  31. while (j <= high) { 
  32. temp[k++] = nums[j++]; 
  33. // 把新數組中的數覆蓋nums數組 
  34. for (int k2 = 0; k2 < temp.length; k2++) { 
  35. nums[k2 + low] = temp[k2]; 
  36.  
  37. public int[] sortMerge(int[] array) { 
  38. return sort(array, 0, array.length - 1); 

6.希爾排序算法

希爾排序的誕生是由于插入排序在處理大規模數組的時候會遇到需要移動太多元素的問題。希爾排序的思想是將一個大的數組“分而治之”,劃分為若干個小的數組,以 gap 來劃分,比如數組 [1, 2, 3, 4, 5, 6, 7, 8] ,如果以 gap = 2 來劃分,可以分為 [1, 3, 5, 7] 和 [2, 4, 6, 8] 兩個數組(對應的,如 gap = 3 , 則劃分的數組為: [1, 4, 7] 、 [2, 5, 8] 、 [3, 6] )然后分別對劃分出來的數組進行插入排序,待各個子數組排序完畢之后再減小 gap 值重復進行之前的步驟,直至 gap = 1 ,即對整個數組進行插入排序,此時的數組已經基本上快排好序了,所以需要移動的元素會很小很小,解決了插入排序在處理大規模數組時較多移動次數的問題,

希爾排序是插入排序的改進版,在數據量大的時候對效率的提升幫助很大,數據量小的時候建議直接使用插入排序就好了。

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5.  
  6. public int[] sortShell(int[] array) { 
  7. // 取增量 
  8. int step = array.length / 2
  9. while (step >= 1) { 
  10. for (int i = step; i < array.length; i++) { 
  11. int temp = array[i]; 
  12. int j = 0
  13. // 跟插入排序的區別就在這里 
  14. for (j = i - step; j >= 0 && temp < array[j]; j -= step) { 
  15. array[j + step] = array[j]; 
  16. array[j + step] = temp; 
  17. step /= 2
  18. return array; 

7.堆排序算法

本質就是先構造一個大頂堆,parent比children大,root節點就是***的節點 把***的節點(root)與尾節點(***一個節點,比較小)位置互換,剩下***的尾節點,現在***,其余的,從***個元素開始到尾節點前一位,構造大頂堆遞歸。

 

 

 

 

  1. /** 
  2. * @param int[] 未排序數組 
  3. * @return int[] 排完序數組 
  4. */ 
  5. public int[] sortHeap(int[] array) { 
  6. buildHeap(array);// 構建堆 
  7. int n = array.length; 
  8. int i = 0
  9. for (i = n - 1; i >= 1; i--) { 
  10. swap(array, 0, i); 
  11. heapify(array, 0, i); 
  12.  
  13. return array; 
  14.  
  15. private void buildHeap(int[] array) { 
  16. int n = array.length;// 數組中元素的個數 
  17. for (int i = n / 2 - 1; i >= 0; i--) 
  18. heapify(array, i, n); 
  19.  
  20. private void heapify(int[] A, int idx, int max) { 
  21. int left = 2 * idx + 1;// 左孩子的下標(如果存在的話) 
  22. int right = 2 * idx + 2;// 左孩子的下標(如果存在的話) 
  23. int largest = 0;// 尋找3個節點中***值節點的下標 
  24. if (left < max && A[left] > A[idx]) 
  25. largest = left; 
  26. else 
  27. largest = idx; 
  28. if (right < max && A[right] > A[largest]) 
  29. largest = right; 
  30. if (largest != idx) { 
  31. swap(A, largest, idx); 
  32. heapify(A, largest, max); 
  33. // 建堆函數,認為【s,m】中只有 s 
  34. // 對應的關鍵字未滿足大頂堆定義,通過調整使【s,m】成為大頂堆===================================================== 
  35. public static void heapAdjust(int[] array, int s, int m) { 
  36. // 用0下標元素作為暫存單元 
  37. array[0] = array[s]; 
  38. // 沿孩子較大的結點向下篩選 
  39. for (int j = 2 * s; j <= m; j *= 2) { 
  40. // 保證j為較大孩子結點的下標,j < m 保證 j+1 <= m ,不越界 
  41. if (j < m && array[j] < array[j + 1]) { 
  42. j++; 
  43. if (!(array[0] < array[j])) { 
  44. break
  45. // 若S位較小,應將較大孩子上移 
  46. array[s] = array[j]; 
  47. // 較大孩子的值變成S位的較小值,可能引起頂堆的不平衡,故對其所在的堆進行篩選 
  48. s = j; 
  49. // 若S位較大,則值不變;否則,S位向下移動至2*s、4*s、。。。 
  50. array[s] = array[0]; 

 

責任編輯:chenqingxiang 來源: Android開發中文站
相關推薦

2018-10-10 14:03:00

Java開發代碼

2020-09-14 14:47:13

排序算法

2015-10-08 09:08:50

Python實現

2021-08-25 09:59:00

開發排序代碼

2016-09-30 14:23:16

數據結構算法八大排序算法

2019-05-29 17:45:32

JavaScript算法思路代碼實現

2020-11-25 10:40:58

程序員技能開發者

2012-06-28 14:01:30

Java程序員排序

2010-05-19 18:23:34

2010-05-21 18:20:43

MySQL常用技巧

2019-09-17 16:30:18

java排序算法

2012-06-27 15:33:30

Java排序算法

2020-08-16 11:37:27

Python開發工具

2023-04-27 09:13:20

排序算法數據結構

2016-12-07 10:42:57

排序算法實例

2013-11-28 09:55:22

算法面試

2010-05-28 18:28:51

MySQL常用命令

2017-04-27 10:38:28

排序算法比較分析

2012-01-09 14:29:15

Java算法

2013-09-26 16:02:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九亚洲 | 野狼在线社区2017入口 | 黄色一级毛片 | 亚洲一区二区三区免费观看 | 欧美日韩一卡 | 在线观看中文字幕 | 99精品一区二区 | 天天综合天天 | 成人精品鲁一区一区二区 | 久久久久久九九九九 | h视频免费在线观看 | 免费的网站www | 欧美一级淫片007 | 久久综合一区 | 亚洲一av | 色播99 | 三级视频在线观看 | 久草视频在线播放 | 日韩超碰在线 | 九九热在线视频观看这里只有精品 | 欧美一区二区三区久久精品 | 欧美二区在线 | 国产99精品 | 妹子干综合 | 中文精品视频 | 日韩一区不卡 | 91精品国产一二三 | 日韩欧美在线观看 | 免费毛片网站 | 天天视频一区二区三区 | 奇米影视首页 | 在线视频a | 欧美精品一区在线 | 精品一区二区三区在线视频 | 在线四虎 | 五月婷婷视频 | 国产乱性| 国产精品无码久久久久 | 亚洲国产成人精品女人久久久 | 伊人网影院 | 中文字幕一区二区三区四区不卡 |