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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法篇】八种内排序算法

發(fā)布時(shí)間:2025/3/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法篇】八种内排序算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

常用的八種內(nèi)排序算法分別是:

  • 交換排序:冒泡排序、快速排序
  • 選擇排序:簡單選擇排序、堆排序
  • 插入排序:直接插入排序、希爾排序
  • 歸并排序
  • 基數(shù)排序
  • 內(nèi)排序巧記:選(選擇)艦(簡單選擇)隊(duì)(堆)的時(shí)候腳(交換)毛(冒泡)快(快速),需要把軌(歸并)跡(基數(shù))擦(插入)仔(直接插入)細(xì)(希爾)

    一、算法的概念和編碼實(shí)現(xiàn)(Java)

    1、冒泡排序

    冒泡排序的基本思想是,對相鄰的元素進(jìn)行兩兩比較,順序相反則進(jìn)行交換,這樣,每一趟會(huì)將最小或最大的元素“浮”到頂端,最終達(dá)到完全有序

    代碼實(shí)現(xiàn)(升序)

    public static void selectSort(int[] array) {int len = array.length;boolean flag = true;for (int i = 0; i < len - 1 && flag; i++) {flag = false;for (int j = 0; j < len - i - 1; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = true;}}}}

    ?

    最好情況的時(shí)間復(fù)雜度最壞情況的時(shí)間復(fù)雜度特點(diǎn)穩(wěn)定性
    T(n)=O(n)T(n)=O(n2)如果數(shù)據(jù)已經(jīng)排序好,一次都不交換或者交換次數(shù)很少,效率很高;如果是完全逆序,則要不停的兩兩交換,效率很低穩(wěn)定

    2、簡單選擇排序

    簡單選擇排序的基本思想是,每一趟從待排序的數(shù)據(jù)元素中選擇一個(gè)最小(或者最大)的元素作為首元素,直到所有元素排完為止。

    代碼實(shí)現(xiàn)(升序):

    public static void selectSort(int[] array) {int len = array.length;for (int i = 0; i < len-1; i++) {int min = i;// 每趟排序默認(rèn)第一個(gè)元素是最小的元素,記住下標(biāo)for (int j = i + 1; j < len; j++) {// 從i+1的位置開始,依次同最小元素比較,若比最小元素小,則記住當(dāng)前下標(biāo)if (array[j] < array[min]) {min = j;}}// 無序區(qū)最小元素同無序區(qū)的第一個(gè)元素交換if (min != i) {int temp = array[min];array[min] = array[i];array[i] = temp;}}} 時(shí)間復(fù)雜度特點(diǎn)穩(wěn)定性
    T(n)=O(n2)簡單,相對于冒泡排序來說交換次數(shù)少不穩(wěn)定

    3、直接插入排序

    直接插入排序基本思想是不斷將無序區(qū)的元素插入到有序區(qū)的適當(dāng)位置,直到無序區(qū)沒有元素排完為止

    代碼實(shí)現(xiàn)(升序):

    private static void insertSort(int[] array) {for (int i = 1; i < array.length; i++) {int j ;int temp = array[i];for (j = i; j>0 && temp < array[j-1]; j--) {array[j] = array[j-1];}array[j] = temp;}}

    ?

    最好情況的時(shí)間復(fù)雜度最壞情況的時(shí)間復(fù)雜度特點(diǎn)穩(wěn)定性
    T(n)=O(n)T(n)=O(n2)簡單穩(wěn)定

    4、快速排序

    對冒泡排序的一種改進(jìn),它的思想是:將元素分為兩組,一組的元素比另外一組的所有元素都要小,然后再按照此方法對兩組元素進(jìn)行排序。

    快速排序我這里就不寫了,快速排序相對于前面三種排序方式來說要復(fù)雜很多,看了一些博客,發(fā)現(xiàn)寫得都不怎么樣,這里推薦一個(gè)講快速排序的視頻https://www.bilibili.com/video/av39519566/?redirectFrom=h5

    附上代碼實(shí)現(xiàn)(參考視頻中的):

    public static void quickSort(int[] arr,int left,int right){//如果左邊索引比右邊索引更大或者相等,直接使用return結(jié)束這個(gè)方法if(left >= right){return;}//定義變量保存基準(zhǔn)數(shù)int base = arr[left];//定義變量i,指向最左邊int i = left;//定義變量j,指向最右邊int j = right;//當(dāng)i和j不相遇的時(shí)候,在循環(huán)中進(jìn)行檢索while(i!=j){//先由j從右向左檢索比基準(zhǔn)數(shù)小的就停下,否則繼續(xù)檢索while(arr[j]>=base && i<j){j--;}//在由i從左向右檢索比基準(zhǔn)數(shù)大的就停下,否則繼續(xù)檢索while(arr[i]<=base && i<j){i++;}//代碼走到這里,i停下了,j也停下了,然后交換i和j位置的元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//交換基準(zhǔn)數(shù)和相遇位置的元素arr[left] = arr[i];arr[i] = base;//排基準(zhǔn)數(shù)左邊的quickSort(arr,left,i-1);//排基準(zhǔn)數(shù)右邊的quickSort(arr,j+1,right);} 最好情況的時(shí)間復(fù)雜度最壞情況的時(shí)間復(fù)雜度平均時(shí)間復(fù)雜度特點(diǎn)穩(wěn)定性
    T(n)=O(nlogn)T(n)=O(n2)T(n)=O(nlogn)較復(fù)雜不穩(wěn)定

    5、希爾排序

    希爾排序是對直接插入排序的優(yōu)化,原理是:將數(shù)據(jù)按照步長dk分為dk個(gè)子列,然后再對每個(gè)子列運(yùn)用直接插入排序。

    當(dāng)步長為5的時(shí)候,分組情況如下:

    ?

    每個(gè)子列排好序后,變成:

    代碼實(shí)現(xiàn)(升序):

    public static void main(String[] args) {int[] array = {49,38,65,97,76,13,27,49,55,4};print(array);ShellSort(array,5);print(array);ShellSort(array,3);print(array);ShellSort(array,1);print(array);}private static void print(int[] array){for (int i = 0; i < array.length; i++) {System.out.print(array[i]+"\t");}System.out.println("\n");}//希爾排序,dk表示步長private static void ShellSort(int[] array,int dk) {for(int k = 0;k<dk;k++){//每個(gè)子組做直接插入插入排序for(int i = dk+k;i<array.length;){int j ;int temp = array[i];for (j = i; j-dk>=0 && temp < array[j-dk]; ) {j -= dk;//上一個(gè)元素的索引需要減去dk,而不是減1array[j] = array[j-dk];}array[j] = temp;i += dk;//下一個(gè)元素索引加上dk,而不是加1}}}

    說明:從代碼層面來看,希爾排序相對于直接插入排序的不同點(diǎn)在于希爾排序外層多了一層循環(huán),用來將原序列分層若干個(gè)子列。內(nèi)部的直接插入排序做減減或者加加時(shí)要改成減去步長或者加上步長

    二、時(shí)間復(fù)雜度和空間復(fù)雜度分析

    排序的穩(wěn)定性:根據(jù)關(guān)鍵字相同(如果數(shù)值比較的話是指大小)的記錄排序前后相對位置的變化,可以分為穩(wěn)定性排序算法和不穩(wěn)定性排序算法。在排序的序列中,如果存在兩個(gè)記錄Ri和Rj,其關(guān)鍵字分別為Ki和Kj,并且i<=j,Ki=Kj,即記錄Ri在Rj之前,排序完成后,如果記錄Ri和Rj的相對位置不發(fā)生改變,那么該算法是穩(wěn)定性排序,否則是不穩(wěn)定排序。

    排序方法時(shí)間復(fù)雜度(最壞情況)空間復(fù)雜度(輔助空間)穩(wěn)定性復(fù)雜性
    簡單選擇排序O(n2)O(1)不穩(wěn)定簡單
    冒泡排序O(n2)O(1)穩(wěn)定簡單
    快速排序O(n2)?不穩(wěn)定較復(fù)雜
    直接插入排序O(n2)O(1)穩(wěn)定簡單
    希爾排序O(n2)O(1)不穩(wěn)定較復(fù)雜

    總結(jié)

    以上是生活随笔為你收集整理的【算法篇】八种内排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。