七大排序


閱讀目錄

  • 分類及比較
  • 冒泡排序
  • 快速排序
  • 選擇排序
  • 插入排序
  • 希爾排序
  • 歸并排序
  • 堆排序

1.分類及比較

排序 比較.jpg

2.冒泡排序

基本思想:兩個數(shù)比較大小,較大的數(shù)下沉挑豌,較小的數(shù)冒起來奈搜。
過程:

  • 比較相鄰的兩個數(shù)據(jù),如果第二個數(shù)小鄙麦,就交換位置典唇。
  • 從后向前兩兩比較邮弹,一直到比較最前兩個數(shù)據(jù)。最終最小數(shù)被交換到起始的位置蚓聘,這樣第一個最小數(shù)的位置就排好了腌乡。
  • 繼續(xù)重復(fù)上述過程,依次將第2.3...n-1個最小數(shù)排好位置夜牡。

代碼:

void BubbleSort(int *pData,int Count)
{
    int iTemp;
    for(int i=0;i<Count-1;i++)
    {
        for(int j=Count-1;j>i;j--)
        {
            if(pData[j]<pData[j-1])
            {
                iTemp=pData[j-1];                
                pData[j-1]=pData[j];                
                pData[j]=iTemp;
            }
        }
    }
}

優(yōu)化:

3.快速排序

基本思想:

  • 先從數(shù)列中取出一個數(shù)作為key值与纽;
  • 將比這個數(shù)小的數(shù)全部放在它的左邊,大于或等于它的數(shù)全部放在它的右邊塘装;
  • 對左右兩個小數(shù)列重復(fù)第二步急迂,直至各區(qū)間只有1個數(shù)。
    代碼:
 public static int[] qsort(int arr[],int start,int end) {        
    int pivot = arr[start];        
    int i = start;        
    int j = end;        
    while (i<j) {            
        while ((i<j)&&(arr[j]>pivot)) {                
            j--;            
        }            
        while ((i<j)&&(arr[i]<pivot)) {                
            i++;            
        }            
        if ((arr[i]==arr[j])&&(i<j)) {                
            i++;            
        } else {                
            int temp = arr[i];                
            arr[i] = arr[j];                
            arr[j] = temp;            
        }        
    }        
    if (i-1>start) arr=qsort(arr,start,i-1);        
    if (j+1<end) arr=qsort(arr,j+1,end);        
    return (arr);    
}    
 
public static void main(String[] args) {        
    int arr[] = new int[]{3,3,3,7,9,122344,4656,34,34,4656,5,6,7,8,9,343,57765,23,12321};        
    int len = arr.length-1;        
    arr=qsort(arr,0,len);        
    for (int i:arr) {            
        System.out.print(i+"\t");        
    }    
}

4.選擇排序

基本思想:
在長度為N的無序數(shù)組中蹦肴,第一次遍歷n-1個數(shù)僚碎,找到最小的數(shù)值與第一個元素交換;
第二次遍歷n-2個數(shù)阴幌,找到最小的數(shù)值與第二個元素交換勺阐;
。矛双。渊抽。
第n-1次遍歷,找到最小的數(shù)值與第n-1個元素交換议忽,排序完成懒闷。
代碼:

void SelectSort(int *a, int len){
    int tmp;
    for(int i=0; i<len-1; i++){
        int k=i;
        for(int j=i+1; j<len; j++){
            if(a[j]<a[k])
                k=j;
        }
        if(k!=i){
            tmp=a[i];
            a[i]=a[k];
            a[k]=tmp;
        }
    }
}

5.插入排序

基本思想:
在要排序的一組數(shù)中,假定前n-1個數(shù)已經(jīng)排好序栈幸,現(xiàn)在將第n個數(shù)插到前面的有序數(shù)列中愤估,使得這n個數(shù)也是排好順序的。如此反復(fù)循環(huán)速址,直到全部排好順序玩焰。
代碼:

void InsertSort(int a[], int n)
{
    for(int i= 1; i<n; i++){
        if(a[i] < a[i-1]){               //若第i個元素大于i-1元素,直接插入壳繁。小于的話震捣,移動有序表后插入
            int j= i-1;
            int x = a[i];        //復(fù)制為哨兵,即存儲待排序元素
            a[i] = a[i-1];           //先后移一個元素
            while(x < a[j]){  //查找在有序表的插入位置
                a[j+1] = a[j];
                j--;         //元素后移
            }
            a[j+1] = x;      //插入到正確位置
        }
    }
}

6.希爾排序

基本思想:
在要排序的一組數(shù)中闹炉,假定前n-1個數(shù)已經(jīng)排好序蒿赢,現(xiàn)在將第n個數(shù)插到前面的有序數(shù)列中,使得這n個數(shù)也是排好順序的渣触。如此反復(fù)循環(huán)羡棵,直到全部排好順序。
代碼:

/** 
 * 直接插入排序的一般形式 
 * 
 * @param int dk 縮小增量嗅钻,如果是直接插入排序皂冰,dk=1 
 * 
 */  
  
void ShellInsertSort(int a[], int n, int dk)  
{  
    for(int i= dk; i<n; ++i){  
        if(a[i] < a[i-dk]){          //若第i個元素大于i-1元素店展,直接插入。小于的話秃流,移動有序表后插入  
            int j = i-dk;     
            int x = a[i];           //復(fù)制為哨兵赂蕴,即存儲待排序元素  
            a[i] = a[i-dk];         //首先后移一個元素  
            while(x < a[j]){     //查找在有序表的插入位置  
                a[j+dk] = a[j];  
                j -= dk;             //元素后移  
            }  
            a[j+dk] = x;            //插入到正確位置  
        }  
        print(a, n,i );  
    }  
}  
  
/** 
 * 先按增量d(n/2,n為要排序數(shù)的個數(shù)進(jìn)行希爾排序 
 * 
 */  
void shellSort(int a[], int n){  
    int dk = n/2;  
    while( dk >= 1  ){  
        ShellInsertSort(a, n, dk);  
        dk = dk/2;  
    }  
}

7.歸并排序

基本思想:
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法的一個非常典型的應(yīng)用舶胀。
首先考慮下如何將2個有序數(shù)列合并概说。這個非常簡單,只要從比較2個數(shù)列的第一個數(shù)嚣伐,誰小就先取誰糖赔,取了后就在對應(yīng)數(shù)列中刪除這個數(shù)。然后再進(jìn)行比較轩端,如果有數(shù)列為空放典,那直接將另一個數(shù)列的數(shù)據(jù)依次取出即可。

8. 堆排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末基茵,一起剝皮案震驚了整個濱河市奋构,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耿导,老刑警劉巖声怔,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舱呻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悠汽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門箱吕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柿冲,你說我怎么就攤上這事茬高。” “怎么了假抄?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵怎栽,是天一觀的道長。 經(jīng)常有香客問我宿饱,道長熏瞄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任谬以,我火速辦了婚禮强饮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘为黎。我一直安慰自己邮丰,他們只是感情好行您,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剪廉,像睡著了一般娃循。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斗蒋,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天捌斧,我揣著相機(jī)與錄音,去河邊找鬼吹泡。 笑死骤星,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爆哑。 我是一名探鬼主播洞难,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揭朝!你這毒婦竟也來了队贱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤潭袱,失蹤者是張志新(化名)和其女友劉穎柱嫌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屯换,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡编丘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彤悔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘉抓。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晕窑,靈堂內(nèi)的尸體忽然破棺而出抑片,到底是詐尸還是另有隱情,我是刑警寧澤杨赤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布敞斋,位于F島的核電站,受9級特大地震影響疾牲,放射性物質(zhì)發(fā)生泄漏植捎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一说敏、第九天 我趴在偏房一處隱蔽的房頂上張望鸥跟。 院中可真熱鬧,春花似錦、人聲如沸医咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟淮。三九已至干茉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間很泊,已是汗流浹背角虫。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留委造,地道東北人戳鹅。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像昏兆,于是被迫代替她去往敵國和親枫虏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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