排序 常見三種 C 實現

2021-09-13 03:11:55 字數 1339 閱讀 6299

簡單總結下堆排序的基本思路:

a.將無序序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;

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

c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

其中建堆的時間複雜度為o(n),而排序時候與二叉樹類似,它的最壞,最好,平均時間複雜度均為o(nlogn),總體還是為o(nlogn)

#include using namespace std;

void adjust(vector& nums,int size,int idx)

if(rightnums[max_idx])

if(max_idx!=idx)

}void heap_sort(vector& nums,int size,int idx)

for(int i=size-1;i>=1;--i)

}int main();

int size=nums.size();

int idx=size/2-1; //這是從後往前的第乙個非葉子節點的座標

heap_sort(nums,size,idx);

for(int i=0;i典型的遞迴回溯,leetcode上也有很多類似題,基本思路為二分到只剩1個後進行合併,然後反著合併直到整體有序

總的時間複雜度o(nlogn),其中merge的合併時間複雜度為o(n),並且基歸冒插,這是穩定的排序方法

class solution

else

} while(l<=mid)

while(r<=last)

//用合併完成的陣列來覆蓋原陣列的值

for(int i=0;i跟歸併其實有點類似,也是遞迴進行。

基本思想就是挖坑+填坑,一般選取第乙個數為基準。之後i,j從兩頭往中間走,首先觀察j的一側是否值比target小,如果是的話填到第乙個位置去,之後從i開始走,找第乙個大於target的值,填到前面j空出的位置,結束迴圈後,target填到最終間的位置,然後左右兩部分遞迴進行,直到整體有序。

void quick_sort(int s, int l, int r)

s[i] = x;

quick_sort(s, l, i - 1); // 遞迴呼叫

quick_sort(s, i + 1, r);}}

再加上乙個base_sort吧,基本思想為計數+放桶,從低位開始進行比較排序,之後一直往高位走,並且排序的次數是和最大值有關的,也就是和位數有關

三種常見的排序演算法

剛開始的時候也聽過學長說什麼什麼排序之類的,到剛聽得時候是各種姿勢懵逼啊,學習了一段時間的c語言之後,才有點明白所謂的排序是什麼,現在就來羅列一下三種常用的排序法氣泡排序法,插入排序法和選擇排序法。氣泡排序啊,這是我聽過最多的乙個排序方法了,他的基本思想也比較簡單,就是不斷比較相鄰的兩個數,讓較小的...

三種最常見的排序

非常恨那些把演算法排序之類的搞得異常麻煩的人,盡可能簡單一點,簡單了,容易理解了,才好記,上了戰場,才用得著.人家的不好用,只好自己總結,重寫原理與過程.口訣 冒泡 n 1,n i 1,比的是j與j 1 插入 n 1,i 1,比的是i 1與j 選擇 n,n,開始變成i 1,比的卻是i與j packa...

常見的三種排序演算法

常見的三種排序演算法 氣泡排序,選擇排序,插入排序 氣泡排序 穩定 重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。兩兩比較 intmain for i 0 i1 i 決定裡面的迴圈迴...