桶排序
- 時(shí)間復(fù)雜度是 O(N + M)
include <stdio.h>
int main() {
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
book[i]=0; scanf("%d",&n);//輸入一個(gè)數(shù)n,表示接下來(lái)有n個(gè)數(shù) for(i=1;i<=n;i++)//循環(huán)讀入n個(gè)數(shù)缭黔,并進(jìn)行桶排序 {
scanf("%d",&t); //把每一個(gè)數(shù)讀到變量t中
book[t]++; //進(jìn)行計(jì)數(shù)拖陆,對(duì)編號(hào)為t的桶放一個(gè)小旗子 }
for(i=1000;i>=0;i--) //依次判斷編號(hào)1000~0的桶 for(j=1;j<=book[i];j++) //出現(xiàn)了幾次就將桶的編號(hào)打印幾次
printf("%d ",i);
getchar();getchar();
return 0;
}
冒泡排序
時(shí)間復(fù)雜度是 O(N^2)
冒泡排序的基本思想是:每次比較兩個(gè)相鄰的元素筒主,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái).
#include <stdio.h>
int main()
{
int a[100],i,j,t,n;
scanf("%d",&n); //輸入一個(gè)數(shù)n尽狠,表示接下來(lái)有n個(gè)數(shù) for(i=1;i<=n;i++) //循環(huán)讀入n個(gè)數(shù)到數(shù)組a中
scanf("%d",&a[i]);
//冒泡排序的核心部分
for(i=1;i<=n-1;i++) //n個(gè)數(shù)排序钞翔,只用進(jìn)行n-1趟 {
for(j=1;j<=n-i;j++) //從第1位開(kāi)始比較直到最后一個(gè)尚未歸位的數(shù),想一想為什 么到n-i就可以了烟具。
{
if(a[j]<a[j+1]) //比較大小并交換
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
} }
for(i=1;i<=n;i++) //輸出結(jié)果 printf("%d ",a[i]);
getchar();getchar();
return 0;
}
快速排序
- 快速排序的最差時(shí)間復(fù)雜度和 冒泡排序是一樣的梢什,都是 O(N2),它的平均時(shí)間復(fù)雜度為 O (NlogN)
-
快速排序的每一輪處理其實(shí)就是將這 一輪的基準(zhǔn)數(shù)歸位朝聋,直到所有的數(shù)都?xì)w位為止嗡午,排序就結(jié)束了
#include <stdio.h>
int a[101],n;//定義全局變量,這兩個(gè)變量需要在子函數(shù)中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基準(zhǔn)數(shù) i=left;
j=right;
while(i!=j)
{
//順序很重要冀痕,要先從右往左找 while(a[j]>=temp && i<j)
j--; //再?gòu)淖笸艺? while(a[i]<=temp && i<j)
i++;
//交換兩個(gè)數(shù)在數(shù)組中的位置 if(i<j)//當(dāng)哨兵i和哨兵j沒(méi)有相遇時(shí) {
t=a[i];
a[i]=a[j];
a[j]=t;
} }
//最終將基準(zhǔn)數(shù)歸位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//繼續(xù)處理左邊的荔睹,這里是一個(gè)遞歸的過(guò)程
quicksort(i+1,right);//繼續(xù)處理右邊的,這里是一個(gè)遞歸的過(guò)程 }
int main() {
int i,j,t; //讀入數(shù)據(jù) scanf("%d",&n); for(i=1;i<=n;i++)
scanf("%d",&a[i]); quicksort(1,n); //快速排序調(diào)用
//輸出排序后的結(jié)果 for(i=1;i<=n;i++)
printf("%d ",a[i]);
getchar();getchar();
return 0;
}