不得不知道的八種排序演算法

2021-09-01 11:35:53 字數 1606 閱讀 5896

寫在前面:

因為網路上有很多篇講排序演算法的,所以這裡就不詳細講了,只作為參考和自己查閱

當然了,雖然篇幅也會短很多,但部分重點和要點還在

八種排序演算法分別是:

①選擇排序; ②氣泡排序; ③插入排序; ④快速排序;

⑤歸併排序; ⑥計數排序; ⑦希爾排序; ⑧堆排序;(藍色為不穩定排序)

一,選擇排序:

特點:應該是90%的人學c語言,所會的第乙個排序

步驟:每次選擇後n-i個數字中最小的和當前第i位交換

複雜度θ(n²),o(n²)

void select_sort(int *a, int n)

}四,快速排序:

特點:非常著名的排序演算法,在所有交換類排序中,它是最快的!

步驟:①在無序的陣列中選擇乙個數x作為基數

②把比x小的數扔到x左邊,比x大的數字扔到x右邊(這個步驟當然是線性的,處理方法略)

③這樣x會把整個陣列分成兩個部分,對於兩個部分重複操作直到有序

注意:一般來講都是選擇當前第乙個數作為基數,如果每次選的基數都恰好是當前最大/最小的,那麼複雜度會達到n²,為了防止上述過程發生,可以有很多優化方法,例如隨機選擇三個數,將其中第二大的數作為基數

複雜度θ(nlogn),o(n²)

void quick_sort(int *a, int l, int r)

b = new int[max-min+1];

memset(b, 0, (max-min+1)*sizeof(int));

for(i=1;i<=n;i++)

b[a[i]-min]++;

p = 0;

for(i=0;i<=max-min;i++)

delete b;

b = null;

}七,希爾排序(縮小增量排序、shell排序):

特點:對於元素基本有序的序列,效率極高

步驟:①設數列有14個元素,設k = 14/2 = 7,對a[1], a[8]進行插入排序,a[2], a[9]進行插入排序,a[3], a[10]進行插入排序……

②再次設k = 7/2 = 3,對a[1], a[4], a[7], a[10], a[13]進行插入排序,a[2], a[5], a[8], a[11], a[14]進行插入排序……

②再次設k = 3/2 = 1,對a[1], a[2], …, a[14]進行插入排序

複雜度θ(n^1.3),o(n²)

void shell_sort(int *a, int n)}}

八,堆排序(二叉排序):

特點:最複雜的乙個排序,詳細講解請戳這裡

步驟:①構造初始堆,將給定無序序列構造成乙個大頂堆(公升序採用大頂堆,降序採用小頂堆)

②將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端

③重新調整堆結構,繼續執行步驟②直到有序

複雜度θ(nlogn),o(nlogn)

void adjust(int *a, int p, int n)    //調整節點p

else

break;

}a[p] = x;    

}void heap_sort(int *a, int n)        //注意我的陣列下標是從1開始的!

}end

不得不知道的補碼知識

無論什麼程式語言,其 最終都會被編譯解釋成計算機可讀取和執行的二進位制資料。其中,數字在二進位制資料中可劃分成原碼 補碼和反碼。原碼 數值前面增了一位符號位 例如 10 和 10 的二進位制表示如下 10 的原碼 0000 1010 10 的原碼 1000 1010其中,最高位表示符號位,0 表示正...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...

程式猿不得不知道的業內「黑話」

程式猿的隊伍越來越龐大了,這裡整理了一些開發周邊的各個渠道的 黑話 趕快瞅瞅吧,別下次聽到時還是一頭霧水了!程式猿 沒必要做那麼複雜 複雜的我不會 外面大家都是這麼做的 我直接複製的 你這個需求不清晰 我不想做 目前技術實現不了 我不想做 那個 有句話 不知 專案要延期了 你告訴我輸什麼我自己來 你...