平方級(jí)的排序算法

插入排序

每次選擇一個(gè)元素K插入到之前已排好序的部分A[1…i]中,由后向前移動(dòng)元素直到找到一個(gè)合適的位置。
插入排序是穩(wěn)定的(相等的時(shí)候表示找到合適位置了,就不需要再移動(dòng)元素了)。

void InsertSort(RecType R[], int n){
    int i, j;
    RecType temp;
    for(i = 1; i<n; ++i){
        temp = R[i];
        j = i - 1;//從后往前找到一個(gè)合適的位置
        while(j >= 0 && temp.key < R[j].key){
            R[j + 1] = R[j];
            j--;
        }
        R[j + 1] = temp;//將元素放置到該合適位置
    }
}

冒泡排序

通過(guò)交換元素,使關(guān)鍵字最大的記錄如氣泡一般逐漸往上“漂浮”直至“水面”。

排序過(guò)程中只交換相鄰兩個(gè)元素的位置。因此,當(dāng)兩個(gè)數(shù)相等時(shí),是沒(méi)必要交換兩個(gè)數(shù)的位置的。所以,它們的相對(duì)位置并沒(méi)有改變,冒泡排序算法是穩(wěn)定的

void BubbleSort(RecType R[], int n){
    int i, j;
    RecType temp;
    for(i=0; i<n-1; i++){//每個(gè)元素
        bool flag = false;
        for(j=n-1;j > i; j--){//對(duì)每個(gè)元素進(jìn)行冒泡
             if(R[j].key < R[j - 1].key){
                 temp = R[j];
                 R[j] = R[j - 1];
                 R[j - 1] = temp;
                 flag = true;
            }
            if(!flag){//如果沒(méi)有交換,說(shuō)明已經(jīng)有序了
                return;
            }
        }
   }
} 

選擇排序

搜索無(wú)序數(shù)組,找到當(dāng)前最小的元素,并與無(wú)序數(shù)組首元素交換,縮小整個(gè)無(wú)序數(shù)組,并重復(fù)操作。直到整個(gè)數(shù)組有序。
由于每次都是選取未排序序列A中的最小元素x與A中的第一個(gè)元素交換,因此跨距離了,很可能破壞了元素間的相對(duì)位置,因此選擇排序是不穩(wěn)定的!

void SelectSort(RecType R[], int n){
    int i, j, k;
    RecType temp;
    for(i = 0; i < n - 1; ++i){
        k = i;
       //便利無(wú)序數(shù)組,找到最小的元素
        for(j = i + 1; j < n; j++){
            if(R[j].key < R[k].key){
                k = j;
            }
        }
        if(k != i){
           swap(R[i], R[k]);
        }
}

希爾排序

思想:希爾排序也是一種插入排序方法,實(shí)際上是一種分組插入方法。先取定一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把表的全部記錄分成d1個(gè)組,所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中,在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個(gè)增量d2(<d1),重復(fù)上述的分組和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?br> 希爾排序時(shí)間復(fù)雜度平均為O(nlogn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總結(jié)一下常見(jiàn)的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,520評(píng)論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,829評(píng)論 0 15
  • 這是我以前寫(xiě)的博客,我遷移過(guò)來(lái)的,時(shí)間寫(xiě)的有點(diǎn)久遠(yuǎn) 1.冒泡排序和選擇排序 為什么把冒泡排序和選擇排序放在一塊兒呢...
    ianCure閱讀 2,385評(píng)論 3 19
  • Git可以設(shè)置全局忽略名單,適用于所有的項(xiàng)目。 在用戶目錄(就windows來(lái)說(shuō)是:C:/Users/用戶名)下創(chuàng)...
    Cindy小隱閱讀 5,550評(píng)論 0 1

友情鏈接更多精彩內(nèi)容