常見排序算法躲胳,及其二分查找

直接插入排序 (穩(wěn)定)O(n^2)

希爾排序(不穩(wěn)定)O(nlog_2n)

冒泡排序(穩(wěn)定)O(n^2)

快速排序(不穩(wěn)定)O(nlog_2n)

直接選擇排序(不穩(wěn)定)O(n^2)

堆排序(不穩(wěn)定)O(nlog_2n)

歸并排序(穩(wěn)定)O(nlog_2n)

基數(shù)排序(穩(wěn)定)

二分查找在最下面....


直接插入:?

分析:

1,從第一個數(shù)的下一個數(shù)開始外層遍歷

2煮岁,然后用當(dāng)前這個數(shù)和這個數(shù)前面的所有數(shù)進行比較,比他大的數(shù)就向后移動移動,提前把這個數(shù)弄到一個temp中存儲起來匠楚。

3,一直到這個數(shù)碰到比他小的數(shù)就退出厂财,并把temp的值賦予退出這個位置

具體舉例:

5,6,1,7,4,8,3,2,9

第一次:從6開始往后遍歷芋簿,用6和5比較

5,6,1,7,4,8,3,2,9

第二次:用1和6比,6>1,所以6向后移動一位璃饱,1然后和5比与斤,5>1,所以5也向后移動一位

1,5,6,7,4,8,3,2,9

第三次:用7和前面的比較

....一直類似的比較到最后

1,2,3,4,5,6,7,8,9

具體算法:

????int a[6]={1,2,3,2,1,6};

? ? int i,j,temp;

? // 插入排序

? ? for(i=1;i<N;i++){

? ? ? ? temp=a[i];

? ? ? ? for(j=i-1;j>=0;j--){

? ? ? ? ? ? if(a[j]>temp){

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

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

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

? ? }


希爾排序:

分析:他是一種縮小增量排序,將相隔某個增量的記錄組成一個子序列,這個序列采用的直接插入排序幽告,增量一趟一趟都在減少梅鹦,知道減少到1,進行最后一次排序

比如:49? 38? ?65? ?97? ?76? ?13? ?27? ?49? ? 55? ? 04

增量是5,3,1

一趟排序:49? 38? ?65? ?97? ?76? ?13? ?27? ?49? ? 55? ? 04

其中 49和13,38和27,65和49...

13 27 49 55 04 49 38 65 97 76

二趟排序:

13,55,38,76排序冗锁,27,04,65排序齐唆,49,49,97排序

13 04 49 38 27 49 55 65 97 76

三趟排序:

14 13? 27 38 49 49 55 65 76 97


折半插入:

void b_insert(int *a,int len){

? ? int i,j,temp,m,low,high;

? ? for(i=1;i<len;i++){

? ? ? ? low=0;

? ? ? ? high=i-1;

? ? ? ? while(low<=high){

? ? ? ? ? ? m=(low+high)/2;

? ? ? ? ? ? if(a[m]>a[i]){

? ? ? ? ? ? ? ? high=m-1;

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? low=m+1;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? temp=a[i];

? ? ? ? for(j=i;j>high+1;j--){

? ? ? ? ? ? a[j]=a[j-1];

? ? ? ? }

? ? ? ? a[high+1]=temp;

? ? }

}


冒泡排序:

分析:記錄兩兩比較關(guān)鍵字,如果前面的比后面的大冻河,就交換箍邮,每一次排序,都保證有最大的升上去了叨叙,有n個記錄锭弊,外層比較次數(shù),n-1擂错,內(nèi)層每次比較n-i-1

這個比較簡單味滞,就不舉例了,直接上算法:

for(i=0;i<N-1;i++){

? ? ? ? int leap=1;

? ? ? ? for(j=0;j<N-i-1;j++){

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

? ? ? ? ? ? ? ? temp=a[j];

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

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

? ? ? ? ? ? ? ? leap=0;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if(leap){

? ? ? ? ? ? break;

? ? ? ? }

? ? }


快速排序:

分析:

1钮呀,找一個中樞記錄剑鞍,一般是第一個值

2,i指向第一個值爽醋,j指向最后一個值

3蚁署,如果j==i,就把中樞記錄賦值給a[i]

4蚂四,如果j>i,一直循環(huán)光戈,如果a[j]>=中樞,j--遂赠,否則久妆,a[i]=a[j]

5,如果j>i,一直循環(huán)跷睦,如果a[i]<=中樞镇饺,i++,否則送讲,a[j]=a[i]

6奸笤,采用遞歸的形式,進行排序

比如:49? ?38? ? ?65? ? ?97? ? ? 76? ? ? ?13? ? ? ?27? ? ? ?49

取p=49

i=0,j=7,分別指向第一個和最后一個值

第一趟排序的過程:

27(i)? ? 38? ? ? 65? ? ? 97? ? ? ? 76? ? ? 13? ? ? ?_j_? ?49

27? ? ? ?38? ? ? _i_? ? ? ?97? ? ? 76? ? ?13? ? ? 65(j)? ? ? 49

27? ? ? ?38? ? ? 13(i)? ? ? 97? ? ? 76? ? ?_j_? ? ? 65? ? ?49

27? ? ? ?38? ? ? 13? ? ? _i_? ? ? 76? ? ? 97(j)? ? ? 65? ? ?49

完成一趟排序:27? ? ? ?38? ? ? 13? ? ? 49(i,j)? ? ?76? ? ? 97? ? ?65? ? ?49

第二趟排序:

{27? ? ? ?38? ? ? 13?}? 49? {?76? ? ? 97? ? ?65? ? ?49}

{13(i)? ? ? 38? ? ? ? _j_}? ?49? { 49(i)? ? ?97? ? ? 65? ? ?_j_}

{13? ? ? ?_i_? ? ? ?38(j)}? ?49? {49? ? _i_? ? ?65? ? ? 97(j)}

{13? ? ? 27? ? ? 38}? ?49? ?{ 49? 65(i)? ?_j_? ? 97}

完成兩趟排序:{13? ? ? 27(i,j)? ? ? ?38}? 49? ?{49? ?65? ? ?76(i,j)? ? ?97}

......{13? ? 27? ? ?38? ? ?49? ? ? 49? ? ? 65? ? ?76? ? ? 97}

具體代碼哼鬓,有遞歸和非遞歸算法:

#include <iostream>

using namespace std;

int zhixing(int *a,int low,int high){

? ? int key=a[low];

? ? int i=low;

? ? int j=high;

? ? while(i<j){

? ? ? ? while(i<j && a[j]>=key){

? ? ? ? ? ? j--;

? ? ? ? }

? ? ? ? if(i<j){

? ? ? ? ? ? a[i]=a[j];

? ? ? ? ? ? i++;

? ? ? ? }

? ? ? ? while(i<j && a[i]<=key){

? ? ? ? ? ? i++;

? ? ? ? }

? ? ? ? if(i<j){

? ? ? ? ? ? a[j]=a[i];

? ? ? ? ? ? j--;

? ? ? ? }

? ? }

? ? a[i]=key;

? ? return i;

}

void kp(int *a,int low,int high){

? ? if(low<high){

? ? ? ? int p=zhixing(a,low,high);

? ? ? ? kp(a,0,p-1);

? ? ? ? kp(a,p+1,high);

? ? }

}

//非遞歸算法

void fei_kuaipai(int *a,int low,int high){

? ? //使用棧监右,來存儲每次分開的列的頭和尾

? ? //使用上面的zhixing(a,low,high)這個方法,把每次的列都排好序异希,low和high從棧中取出健盒,一直到棧為空,就排完序了

? ? int mid=zhixing(a,low,high);//首先把這個數(shù)組分開,mid左邊都是比他小的扣癣,右邊都是比他大的

? ? //定義一個棧

? ? stack<int> s;

? ? if(low<mid-1){

? ? ? ? s.push(low);

? ? ? ? s.push(mid-1);

? ? }

? ? if(high>mid+1){

? ? ? ? s.push(high);

? ? ? ? s.push(mid+1);

? ? }

? ? while(!s.empty()){//棧為空退出循環(huán)

? ? ? ? low=s.top();

? ? ? ? s.pop();

? ? ? ? high=s.top();

? ? ? ? s.pop();

? ? ? ? mid=zhixing(a,low,high);//在對子序列進行排序

? ? ? ? if(low<mid-1){

? ? ? ? ? ? s.push(low);

? ? ? ? ? ? s.push(mid-1);

? ? ? ? }

? ? ? ? if(high>mid+1){

? ? ? ? ? ? s.push(high);

? ? ? ? ? ? s.push(mid+1);

? ? ? ? }

? ? }

}

int main()

{

? ? //快速排序

? ? int a[6]={1,2,3,4,2,1};

? ? kp(a,0,5);

? ? fei_kuaipai(a,0,5);

? ? int i;

? ? for(i=0;i<6;i++){

? ? ? ? cout<<a[i]<<" ";

? ? }

? ? return 0;

}


選擇排序:

分析:

1惰帽,每次保證確定是最小的,從0開始遍歷父虑,每次都假設(shè)第一個數(shù)是最小的该酗,向后遍歷

2,如果碰到比這個數(shù)小的士嚎,就把下標(biāo)賦值給min

3呜魄,判斷一下看這個最小的是否還是剛開始的,如果不是莱衩,就把最小的和這個數(shù)交換位置

4爵嗅,然后進行下次遍歷,保證最前面是最小的

代碼如下:

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

? ? ? ? int min=i;

? ? ? ? for(j=i+1;j<N;j++){

? ? ? ? ? ? if(a[j]<a[min]){

? ? ? ? ? ? ? ? min=j;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if(min!=i){

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

? ? ? ? ? ? a[i]=a[min];

? ? ? ? ? ? a[min]=temp;

? ? ? ? }

? ? }


堆排序:

構(gòu)建大頂堆(父大于子)笨蚁,或構(gòu)建小頂堆(父小于子)睹晒,然后進行調(diào)整,再構(gòu)建括细,在調(diào)整伪很,....直到最后的根節(jié)點,排序完成勒极。


歸并排序:

2路歸并排序---先對子集排序是掰,歸并

比如:

3? ? 2? ? ?5? ? ?1? ? ? 6? ? ? ? 8? ? ? 4

第一趟:{2? ? ? 3}? ? ? ?{1? ? ? ? 5}? ? ? ? {6? ? ? ? 8 }? ? ? {4}

第二趟:{1? ? ? ? 2? ? ? ? 3? ? ? ? 5? }? ? ?{ 4? ? ? ? 6? ? ? ? 8}

第三趟:{1? ? ? ? 2? ? ? ? 3? ? ? ? 4? ? ? ? 5? ? ? ? 6? ? ? ? 8}


基數(shù)排序(桶排序):

分析:

從個位開始進行第一趟虑鼎,下來的是從小到大排序的辱匿,每次依序進入桶中,進入完成之后炫彩,從下面依次出來匾七,然后在從十位開始進入,...直到最后一趟江兢,排序完成


二分查找:

分析:必須是有序序列昨忆,才可以進行二分查找,在做題的過程中可以構(gòu)造折半二叉樹杉允,就是一顆二叉排序樹邑贴。每次找的中間的數(shù)都是下標(biāo)(a+b)/2向下取整的下標(biāo)對應(yīng)的數(shù)。

算法:

int min=0,max=N-1,mid=(min+max)/2;

? ? int n;

? ? scanf("%d",&n);

? ? while(min<=max){

? ? ? ? if(a[mid]==n){

? ? ? ? ? ? printf("%d ",mid);

? ? ? ? ? ? break;

? ? ? ? }else if(n>a[mid]){

? ? ? ? ? ? min=mid+1;

? ? ? ? }else if(n<a[mid]){

? ? ? ? ? ? max=mid-1;

? ? ? ? }

? ? ? ? mid=(max+min)/2;

? ? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載叔磷,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者拢驾。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市改基,隨后出現(xiàn)的幾起案子繁疤,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠腊,死亡現(xiàn)場離奇詭異躁染,居然都是意外死亡,警方通過查閱死者的電腦和手機架忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門吞彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳖昌,你說我怎么就攤上這事备畦。” “怎么了许昨?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵懂盐,是天一觀的道長。 經(jīng)常有香客問我糕档,道長莉恼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任速那,我火速辦了婚禮俐银,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘端仰。我一直安慰自己捶惜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布荔烧。 她就那樣靜靜地躺著吱七,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹤竭。 梳的紋絲不亂的頭發(fā)上踊餐,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音臀稚,去河邊找鬼吝岭。 笑死,一個胖子當(dāng)著我的面吹牛吧寺,可吹牛的內(nèi)容都是我干的窜管。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼稚机,長吁一口氣:“原來是場噩夢啊……” “哼幕帆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抒钱,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蜓肆,失蹤者是張志新(化名)和其女友劉穎颜凯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗扬,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡症概,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了早芭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼城。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖退个,靈堂內(nèi)的尸體忽然破棺而出募壕,到底是詐尸還是另有隱情,我是刑警寧澤语盈,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布舱馅,位于F島的核電站,受9級特大地震影響刀荒,放射性物質(zhì)發(fā)生泄漏代嗤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一缠借、第九天 我趴在偏房一處隱蔽的房頂上張望干毅。 院中可真熱鬧,春花似錦泼返、人聲如沸硝逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渠鸽。三九已至,卻和暖如春霹疫,著一層夾襖步出監(jiān)牢的瞬間拱绑,已是汗流浹背综芥。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工丽蝎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膀藐。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓屠阻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親额各。 傳聞我的和親對象是個殘疾皇子国觉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,325評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序虾啦,而外部排序是因排序的數(shù)據(jù)很大麻诀,一次不能容納全部...
    蟻前閱讀 5,167評論 0 52
  • 1痕寓、常用排序算法 2、快速排序法 基本思想:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分蝇闭,其中一部分的所有數(shù)據(jù)都比...
    Bling_ll閱讀 532評論 0 0
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • 跟心與心工作室惠玲老師讀完《接納力》兩本書呻率,在讀之前,我是先在喜馬拉雅聽呻引,每天有機會就聽礼仗,一遍接一遍,有...
    愿我擁有幸福的能力閱讀 114評論 0 0