日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软考 - 排序算法

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软考 - 排序算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1.總覽
    • 1.待操作數組
    • 2.直接插入排序(O(n2))
    • 3.希爾排序
    • 4.直接選擇排序
    • 5.堆排序
      • 5.1.堆的分類
      • 5.2.原理:
      • 5.3. 堆排序方法:
    • 6.冒泡排序
  • 7.快速排序
  • 8.歸并排序
  • 9.基數排序

1.總覽

1.待操作數組

private static int[] ori = {30, 70, 40, 60, 10, 90, 20, 50, 80, 100};

2.直接插入排序(O(n2))

原理:當插入第i個元素時,R1,R2 … Ri-1已經基本有序,將i元素和R1,R2 … Ri-1比較,插入合適的位置。

實現一(原理直譯成代碼,用兩個數組,將原數組元素逐個插入新數組):

public static int[] straightInsertionSort(int[] ori) {//初始化sortint [] sort = new int[ori.length];//逐個將ori元素插入sortfor (int i = 0; i < ori.length; i++) {int ele = ori[i];if(i == 0){//sort 為空,ele 放入第一位置sort[0] = ele;}else {//sort 不為空,ele 與 sort 逐個比較for (int j = 0; j < sort.length; j++) {if(ele<sort[j]){//ele 小于 當前sort,ele 放入當前位置,sort 其余值后移for (int k = sort.length-1 ; k>j ; k--){sort[k] = sort[k-1];}sort[j] =ele;break;}else if(0==sort[j+1]){ //由于int數組初始化后,每一位默認值都是0,如果下一位為0,當前位就是最后一位//ele 比sort最后一個元素大,放入最后一個位置sort[j+1] =ele;break;}else {//比當前sort大,且當前sort不是最后一個值,就和下一個sort比較continue;}}}}return sort;}

3.希爾排序

原理:R1,R2 … Ri-1,取一個小于i的整數d1作為第一個增量,將所有距離間隔d1的元素放到一組(頭和尾,不包括中間),組內直接選擇排序;然后取第二個增量d2<d1重復分組和排序,直至dt=1;

4.直接選擇排序

原理:R1,R2 … Ri-1,將最小的元素與第1個位置元素交換;在剩余其他元素中選出最小的元素與第2個位置交換;…直至整體都排列好。

public static int[] straightSelectSort(int[] ori) {int minIndex = 0;//最小數值角標int temp = 0;//交換臨時空間for (int i = 0; i < ori.length; i++) {minIndex = i;//最小數值角標初始化為當前i//當前剩余未排序的數組中 選出最小的元素的角標for (int j = i + 1; j < ori.length; j++) {if (ori[minIndex] > ori[j]) {minIndex = j;}}//將最小位置與當前第i位交換temp = ori[i];ori[i] = ori[minIndex];ori[minIndex] = temp;}return ori;}

5.堆排序

5.1.堆的分類

大頂堆:所有父節點都比子節點大;用于從大到小排列;
小頂堆:所有父節點都比子節點小;用于從小到大排列;

5.2.原理:

R1,R2 … Ri-1,將所有元素構建成小頂堆,取出根節點即為最小值。重新調整堆結構,再取出根節點即為次小值…堆排序適合取出前n個值。

5.3. 堆排序方法:

小頂堆的構造方法:先將所有值最為節點構成完全二叉樹,從最后一個節點到根節點,根據小頂堆的調整方法調整;
小頂堆的排序方法:取出根節點后,把完全二叉樹的最后一個節點放到根節點的位置,從根節點開始,根據小頂堆的調整方法調整;
小頂堆的調整方法:檢查當前左右子節點是否都比根節點大,不滿足,則交換最小子節點與父節點的位置。如果調整后子節點不為葉子節點,則遞歸調整以該葉子節點為根節點的樹;

在這里插入代碼片

6.冒泡排序

原理:相鄰的元素進行比較和交換,將排序碼小的元素逐漸從底部移到頂部;整個過程就像是水底的氣泡逐漸上冒;

public static void bubbleSort(int[] ori){int temp = 0;//外層循環,每次循環都選出一個最大得放置在數組最后for (int i = 0; i < ori.length-1; i++) {//內層循環,數組末尾放置好的元素不在動for (int j = 0; j < ori.length-1-i; j++) {if (ori[j] > ori[j+1]) {//相鄰兩個數比較,大的右移temp = ori[j];ori[j] = ori[j+1];ori[j+1] =temp;}}}}

7.快速排序

原理:
分治法(將原問題分解成若干規模更小單結構和原問題相似的子問題,通過遞歸的解決子問題,將子問題的解組合成原問題的解)
第一步:待排序數組中 ,取一個數作為基準,將所有記錄分成兩組,第1組都小于基準,第2組都大于基準;
第二布:采用相同的方法對左右兩組進行排序,直到所有記錄排到相應的位置;

/** @Description: 快速排序* @param arr: 待排序數組* @param begin: 開始元素角標* @param end: 末尾元素角標* @return void* @see*/private static void quickSort(int[] arr, int begin, int end) {if(begin<end){int index = patition(arr,begin,end);//基準角標(index左側元素都比arr[index]小,index右側元素都比arr[index]大)quickSort(arr,begin,index-1);//遞歸對分區的左側快速排序quickSort(arr,index+1,end);//遞歸對分區的右側快速排序}}/** @Description: 以最后一個元素最為元素基準,將數組分冊兩個區域* @param arr: 帶分區數組* @param begin: 開始元素角標* @param end: 末尾元素角標* @return int 基準角標* @see*/private static int patition(int[] arr, int begin, int end) {int index = begin-1;//基準 初始角標int patition = arr[end];//基準數值 取最后一個元素的值for (int i = begin; i <= end-1; i++) {if(arr[i]<=patition){//當前值比基準值小index++;//index角標右移一位swap(arr,i,index);//把當前元素和index元素的數值交換}}//index角標右移一位的角標,就是第一個比基準數值大的元素,交換兩者位置,就實現了快速排序的分區swap(arr,++index,end);return index;}/** @Description: 交換數組兩個元素的數值*/private static void swap(int[] arr, int x, int y) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}

8.歸并排序

原理:先將整個待排序數組分成若干子表;完成子表內的排序;將兩個或兩個以上的有序子表合并成一個新的有序表(合并過程:比較A[i]和B[j]的排序碼,將較小的元素復制到R[k]中,并令i(或j)和k分別加1,如此循環下去,知道A或B比較復制完,將另一個有序表剩余元素復制到R中);

9.基數排序

原理:適用于元素很多,但是關鍵字很少的序列;例如,多個百以內的數字排序,關鍵字只有三個,個位,十位,百位。

總結

以上是生活随笔為你收集整理的软考 - 排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。