常見算法:C語言中的排序算法--冒泡排序货岭,選擇排序,希爾排序

冒泡排序(Bubble Sort疾渴,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序算法千贯。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素搞坝,如果他們的順序錯誤就把他們交換過來搔谴。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成桩撮。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端

/*

用選擇法對10個數(shù)進行排序

*/

#include<stdio.h>

void main()

{

int i,j,a[10];

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<9;i++)?

{//n個數(shù)要進行n-1趟比較

for(j=0;j<=9-i;j++)? ? ? ? ? //每趟比較n-i次

if(a[j]>a[j+1])? ? ? ? ? //依次比較兩個相鄰的數(shù)敦第,將小數(shù)放在前面,大數(shù)放在后面

{

int t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

for(i=0;i<10;++i)? ? ? ? ? ? ? //輸出比較之后的數(shù)組

printf(" %d",a[i]);

}

另一種常見的寫法

/*

冒泡排序的另外一種寫法

*/

#include<stdio.h>

void BubbleSort(int a[],int n)

{

int i,j;

for(i=n-1;i>0;--i)? ? ? ? ? //從n-1循環(huán)的到0店量,也是n次

for(j=0;j<i;j++)

if(a[j]>a[j+1])

{

int temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

void main()

{

int a[10],i;

for(i=0;i<10;i++)

scanf("%d",&a[i]);

BubbleSort(a,10);

printf("排序后的數(shù)組:\n");

for(i=0;i<10;i++)

printf(" %d",a[i]);

}

選擇排序(Selection sort)是一種簡單直觀的排序算法芜果。它的工作原理如下。首先在未排序序列中找到最小元素融师,存放到排序序列的起始位置右钾,然后,再從剩余未排序元素中繼續(xù)尋找最小元素诬滩,然后放到排序序列末尾(目前已被排序的序列)霹粥。以此類推,直到所有元素均排序完畢疼鸟。

#include<stdio.h>

void SelectSort(int a[],int n)?

{?

? ? int i,j;?

? ? for(i=0;i<n-1;i++)? ? ? ? ? ? ? //n個數(shù)要進行n-1趟比較后控,每次確定一個最小數(shù)放在a[i]中?

? ? {?

? ? ? ? int k=i;? ? ? ? ? ? ? ? ? ? //假設(shè)a[0]是最小的數(shù),把下標(biāo)0放在變量K里面空镜,?

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

? ? ? ? ? ? if(a[k]>a[j])? k=j;? ? //如果a[k]>a[j] 前面的數(shù)比后面的數(shù)大浩淘,交換下標(biāo)捌朴,此時k指向小的數(shù)?

? ? ? ? if(k!=i)?

? ? ? ? {?

? ? ? ? ? ? int temp=a[i];?

? ? ? ? ? ? a[i]=a[k];?

? ? ? ? ? ? a[k]=temp;?

? ? ? ? }?

? ? }?


}?

void main()?

{?

? ? int a[10],i;?

? ? for(i=0;i<10;i++)?

? ? ? ? scanf("%d",&a[i]);?

? ? SelectSort(a,10);?

? ? printf("排序后的數(shù)組:\n");?

? ? for(i=0;i<10;i++)?

? ? ? ? printf(" %d",a[i]);?

}?

希爾排序通過將比較的全部元素分為幾個區(qū)域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步张抄。然后算法再取越來越小的步長進行排序砂蔽,算法的最后一步就是普通的插入排序,但是到了這步署惯,需排序的數(shù)據(jù)幾乎是已排好的了(此時插入排序較快)左驾。

假設(shè)有一個很小的數(shù)據(jù)在一個已按升序排好序的數(shù)組的末端。如果用復(fù)雜度為O(n2)的排序(冒泡排序或插入排序)极谊,可能會進行n次的比較和交換才能將該數(shù)據(jù)移至正確位置诡右。而希爾排序會用較大的步長移動數(shù)據(jù),所以小數(shù)據(jù)只需進行少數(shù)比較和交換即可到正確位置轻猖。

一個更好理解的希爾排序?qū)崿F(xiàn):將數(shù)組列在一個表中并對列排序(用插入排序)帆吻。重復(fù)這過程,不過每次用更長的列來進行咙边。最后整個表就只有一列了猜煮。將數(shù)組轉(zhuǎn)換至表是為了更好地理解這算法,算法本身僅僅對原數(shù)組進行排序(通過增加索引的步長败许,例如是用i += step_size而不是i++)王带。

例如,假設(shè)有這樣一組數(shù)[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ]市殷,如果我們以步長為5開始進行排序辫秧,我們可以通過將這列表放在有5列的表中來更好地描述算法,這樣他們就應(yīng)該看起來是這樣:

13 14 94 33 82

25 59 94 65 23

45 27 73 25 39

10

然后我們對每列進行排序:

10 14 73 25 23

13 27 94 33 39

25 59 94 65 82

45

當(dāng)我們以單行來讀取數(shù)據(jù)時我們得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].這時10已經(jīng)移至正確位置了被丧,然后再以3為步長進行排序:

10 14 73

25 23 13

27 94 33

39 25 59

94 65 82

45

排序之后變?yōu)椋?/p>

10 14 13

25 23 33

27 25 59

39 65 73

45 94 82

94

最后以1步長進行排序(此時就是簡單的插入排序了)盟戏。

//希爾排序

#include<stdio.h>

#define LT(a,b) ((a)<(b))

#define MAX_SIZE 20

#define T 3? ?

#define N 10

typedef int KeyType;

typedef int InfoType;

typedef struct

{

KeyType key;

InfoType otherinfo;

}RedType;

typedef struct

{

RedType r[MAX_SIZE+1];

int length;

}SqList;

void PrintSqList(SqList L)

{

int i;

for(i=1;i<L.length;i++)

{

printf("(%d %d)",L.r[i].key,L.r[i].otherinfo);

}

printf("\n");

}

int? PrintSqlListKey(SqList L)

{

int i;

for(i=1;i<L.length;i++)

{

printf("%d ",L.r[i].key);

}

printf("\n");

return 0;

}

void ShellInsert(SqList &L,int dk)

{

int i,j;

for(i=dk+1;i<=L.length;i++)

{

if LT(L.r[i].key,L.r[i-dk].key)

{

L.r[0]=L.r[i];

for(j=i-dk;j<0&& LT(L.r[i].key,L.r[j].key);j-=dk)

{

L.r[j+dk]=L.r[j];

}

L.r[j+dk]=L.r[0];

}

}

}

void ShellSort(SqList &L,int dlta[],int t)

{

int k;

for(k=0;k<t;k++)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //對所有增量序列

{

ShellInsert(L,dlta[k]);

printf("dlta[%d]=%d,第%d趟排序結(jié)果(僅輸出關(guān)鍵字):",k,dlta[k],k+1);

PrintSqlListKey(L);

}

}

void main()

{

RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,65},{13,6},{27,7},{49,8},{55,9},{4,10}};

SqList m;

int i,dt[T]={5,3,1};

for(i=0;i<N;i++)

{

m.r[i+1]=d[i];

}

m.length=N;

printf("希爾排序前:\n");

PrintSqList(m);

printf("\n");

ShellSort(m,dt,T);

printf("希爾排序后:\n");

PrintSqList(m);

printf("\n");

}

歡迎工作一到五年的Java工程師朋友們加入Java學(xué)習(xí)之路:733234221

群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)甥桂、高性能及分布式柿究、Jvm性能調(diào)優(yōu)、Spring源碼黄选,MyBatis蝇摸,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰办陷!趁年輕貌夕,使勁拼,給未來的自己一個交代

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民镜,一起剝皮案震驚了整個濱河市啡专,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌制圈,老刑警劉巖们童,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔况,死亡現(xiàn)場離奇詭異,居然都是意外死亡慧库,警方通過查閱死者的電腦和手機跷跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐板,“玉大人吵瞻,你說我怎么就攤上這事「誓ィ” “怎么了听皿?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宽档。 經(jīng)常有香客問我,道長庵朝,這世上最難降的妖魔是什么吗冤? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮九府,結(jié)果婚禮上椎瘟,老公的妹妹穿的比我還像新娘。我一直安慰自己侄旬,他們只是感情好肺蔚,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著儡羔,像睡著了一般宣羊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汰蜘,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天仇冯,我揣著相機與錄音,去河邊找鬼族操。 笑死苛坚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的色难。 我是一名探鬼主播泼舱,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枷莉!你這毒婦竟也來了娇昙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤笤妙,失蹤者是張志新(化名)和其女友劉穎涯贞,沒想到半個月后枪狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宋渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年州疾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皇拣。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡严蓖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氧急,到底是詐尸還是另有隱情颗胡,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布吩坝,位于F島的核電站毒姨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钉寝。R本人自食惡果不足惜弧呐,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嵌纲。 院中可真熱鬧俘枫,春花似錦、人聲如沸逮走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽师溅。三九已至茅信,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墓臭,已是汗流浹背汹押。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留起便,地道東北人棚贾。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像榆综,于是被迫代替她去往敵國和親妙痹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 我和你鼻疮,有過委屈怯伊,沒有什么不同。身不由己判沟,人生出不了大事故耿芹,撐死了不過是一段段睡前小故事而已崭篡。
    六號夢閱讀 149評論 5 1
  • 一直以來以為做自己喜歡的事便會快樂!便會開心吧秕,今天一席話琉闪,頓然開悟!做自己喜歡的事就會沒有煩惱嗎砸彬?答案當(dāng)然是否定的...
    夫子書社閱讀 242評論 0 0
  • JVM垃圾回收機制 提到Java垃圾回收機制就不得不提到一個方法: system.gc()用于調(diào)用垃圾收集器颠毙,在調(diào)...
    天青色的魚兒閱讀 202評論 0 0