八大排序演算法

2021-08-08 23:05:08 字數 2157 閱讀 5901

目錄:

- 1.計數排序

- 2.基數排序

- 3.快速排序

- 4.氣泡排序

- 5.選擇排序

- 6.歸併排序

- 7.堆排序

- 8.插入排序

時間複雜度:o(n+k)

空間複雜度:k+n

是否穩定:穩定

**實現:

for(int i=0;i"%d",&a[i+1]);

c[a[i+1]]++;

}for(int i=1;i1];

for(int j=1;j<=n;j++)

for(int i=1;i<=n;i++)printf("%d ",b[i]);

基數排序(gay sort)非常快,史(小c)稱最快排序。但是只能排自然數。

時間複雜度:o(d(n+k)) k為基數,d為最大的位數

空間複雜度:n+r

是否穩定:穩定

**實現:

#define n 65536

#define m 100005

int p=(1

<<16)-1;

void gaysort()

快速排序(quick sort)是一種比較快的原地排序但是不穩定。

平均複雜度:o(nlog(n))

最差複雜度:o(n^2)

空間複雜度:o(n)

是否穩定:不穩定

**實現:

void sort(int l,int r)

a[a]=key;

if(a-1>l)sort(l,a-1);

if(a+1

a+1,r);

}

氣泡排序是將大的數乙個乙個swap上去,是穩定的演算法,但是比較慢

時間複雜度o(n^2)

空間複雜度o(n)

是否穩定:穩定

**實現:

int* bubblesort(int* ary, int

length)}}

return ary;

}

選擇排序比較無腦(個人認為),每一次把最小的選出來放在最前面,就實現了排序。

時間複雜度:o(n^2)

空間複雜度:o(n)

**實現:

for(int i=1;i<=n;i++)
歸併排序利用了分治的思想,將乙個陣列切成兩半,然後在排序

時間複雜度:o(nlog(n))

空間複雜度:o(n)

是否穩定:穩定

**實現:

void merge(int l,int r) 

}while(i<=mid)b[k++]=a[i++];

while(j<=r)b[k++]=a[j++];

for(k=l;k<=r;k++)a[k]=b[k];

}

堆排序沒什麼用,個人覺得用stl裡面的priority_queue或是multiset都可以滿足。但是這排序的想法與實現都是非常重要的

時間複雜度:o(nlog(n))

空間複雜度:o(n)

是否穩定:不穩定

**實現:

void swap(int &a,int &b)

void down(int k)

}//初始化堆得時候,可以把n/2到1的每個元素都down下。

int heap[200005],sz;//sz記錄當前堆得大小,也是最後乙個元素的下標

int main()

return0;}

/*堆也可以新增元素,原理down類似,用up,把數字新增在heap[++sz]的位置上。

如果父親節點比當前元素小,就不斷向上。*/

void up(int k)

}

插入排序說的形象點就是像打牌理牌差不多,找第乙個比他大的位置,再把數字往後移。

時間複雜度:o(n^2)

空間複雜度:o(n)

是否穩定:不穩定

**實現:

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

八大排序演算法

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...

八大排序演算法

一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...

八大排序演算法

排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...