九種排序具體實(shí)現(xiàn)代碼

聲明:本文內(nèi)容純屬博主自己查找和歸納的個人所需的知識點(diǎn)撞叽,僅作參考愿棋,如有錯誤,博主強(qiáng)烈希望您指出才睹。如果您是某個知識點(diǎn)的原創(chuàng)博主,如有需要琅攘,可聯(lián)系本人加上鏈接坞琴。本文內(nèi)容會根據(jù)博主所需進(jìn)行更新,希望大家多多關(guān)照寒亥。

直接插入排序

void InsertSort(int r[])
{
    int n = sizeof(r) / sizeof(r[0]);
    for(int i = 1; i < n; ++i)
    {
        for(int j = i - 1; j >= 0; --j)
        {           
            if(r[j+1] < r[j])
            {
                int s = r[j+1];
                r[j+1] = r[j];
                r[j] = s;
            }
        }
    }
}

折半插入排序

void BinInsertSort(int r[])
{
    int n = sizeof(r) / sizeof(r[0]);
    for(int i = 1; i < n; ++i)
    {
        int s = r[i];
        int low = 0;
        int high = i - 1;
        
        while(low <= high)
        {
            int mid = (low + high) / 2;  //mid位置為要找的數(shù)
            if(s < r[mid])
                high = mid - 1;
            else
                low = mid + 1;
        }
        
        for(int j = i - 1; j >= high + 1; --j)  //high+1即mid溉奕,執(zhí)行數(shù)的后移羞酗,直到mid的數(shù)后移
            r[j+1] = r[j];
        
        r[high+1] = s;  //mid位置就存放本身
    }
}

希爾排序

void ShellSort(int r[])
{
    int n = sizeof(r) / sizeof(r[0]);
    int step = n / 2;
    
    while(step >= 1)
    {
        for(int i = step; i < n; ++i)
        {
            for(int j = i - step; j >= 0; j -= step)
            {               
                if(r[j+step] < r[j])
                {
                    int s = r[j+step];
                    r[j+step] = r[j];
                    r[j] = s;
                }
            }
        }
        step /= 2;
    }
}

直接選擇排序

void SelectSort(int r[])
{
    int n = sizeof(r) / sizeof(r[0]);
    for(int i = 0; i < n - 1; ++i)
    {
        int samll = i;
        for(int j = i + 1; j < n; ++j)
        {
            if(r[small] > r[j])
                samll = j;
        }
        if(small != i)
        {
            int s = r[i];
            r[i] = r[small];
            r[small] = s;
        }
    }
}

堆排序

void HeapAdjust(int r[]; int i; int j)  //調(diào)整堆
{
    int child = 2 * i;
    int s = r[i];  //s臨時存放結(jié)點(diǎn)數(shù)據(jù)
    while(child <= j)
    {
        if(child < j && r[child+1] > r[child])  //比較2個子樹
            ++child;
        if(s >= r[child])  //結(jié)點(diǎn)與大子樹比較
            break;
        r[child/2] = r[child];  //如果大子樹比結(jié)點(diǎn)大胸竞,互換
        child = 2 * child;  //繼續(xù)向子樹檢索
    }
    r[child/2] = s;  //結(jié)點(diǎn)的數(shù)為最大的數(shù)
}

void HeapSort(int r[])  //建堆
{
    int n = sizeof(r) / sizeof(r[0]);
    for(int i = n / 2 - 1; i >= 0; --i)  //只有n/2-1前的下標(biāo)才有子樹
    {
        HeapAdjust(r, i, n - 1);  //構(gòu)造大頂堆卫枝,結(jié)點(diǎn)都比子樹大讹挎,最后根節(jié)點(diǎn)為最大的數(shù)
    }
    for(int i = n - 1; i > 0; --i)
    {
        //將當(dāng)前堆頂元素與當(dāng)前堆尾元素互換筒溃,即將最大的數(shù)移到末尾
        int s = r[0];
        r[0] = r[i];
        r[i] = s;
        HeapAdjust(r, 0, i -1);  //將剩下的元素繼續(xù)調(diào)整,最后變成由小到大的順序
    }
}

冒泡排序

void BubbleSort(int r[])
{
    int n = sizeof(r) / sizeof(r[0]);
    for(int i = 0; i < n - 1; ++i)
    {
        for(int j = 0; j < n - 1 - i; ++j)
        {
            if(r[j] > r[j+1])
            {
                int s = r[j];
                r[j] = r[j+1];
                r[j+1] = s;
            }
        }
    }
}

快速排序

int Partition(int r[], int low, int high)
{
    int pivotkey = r[low];
    int i = low;
    int j = high;
    
    while(i < j)
    {
        while(i < j && r[j] > pivotkey)  //從j往前找浑测,找出第一個比pivotkey小的數(shù)
            --j;
        if(i < j)
        {
            r[i] = r[j];
            ++i;
        }
        
        while(i < j && r[i] < pivotkey)  //從i往后找迁央,找出第一個比pivotkey大的數(shù)
            ++i;
        if(i < j)
        {
            r[j] = r[i];
            --j;
        }
    }
    r[j] = pivotkey;  //完成最終交換
    return j;  //返回分界點(diǎn),前面的數(shù)都比pivotkey小滥崩,后面的數(shù)都比pivokey大
}

void QuickSort(int r[], int low, int high) // 傳數(shù)組岖圈、0和長度-1
{
    if(low < high)
    {
        int pivot = Partition(r, low, high);
        QuickSort(r, low, pivot - 1);  //遞歸,前半部分繼續(xù)進(jìn)行快速排序
        QuickSort(r, pivot + 1; high);  //遞歸钙皮,后半部分繼續(xù)進(jìn)行快速排序
    }
}

歸并排序

void copyArray(int source[], int dest[], int len, int first)
{
    int i;
    int j = first;
    for(i = 0; i < len; ++i)
    {
        dest[j] = source[i];
        ++j;
    }
}

void merge(int a[], int left, int right)
{
    int begin1 = left;
    int mid = (left + right) / 2;
    int begin2 = mid + 1;
    int newArrayLen = right - left + 1;
    int *b = (int*)malloc(newArrayLen * sizeof(int));
    int k = 0;
    
    while(begin1 <= mid && begin2 <= right)  //找出2組中比較后小的那個數(shù)按順序放進(jìn)b空間
    {
        if(a[begin1] <= a[begin2])
            b[k++] = a[begin1++];
        else
            b[k++] = a[begin2++];
    }
    
    //把剩下的數(shù)放進(jìn)b空間
    while(begin1 <= mid)
        b[k++] = a[begin1++];
    while(begin2 <= right)
        b[k++] = a[begin2++];
    
    copyArray(b, a, newArrayLen, left);  //把b空間的數(shù)寫回原數(shù)組
    free(b);
}

void  MergeSort(int r[], int left, int right)  //傳數(shù)組蜂科、0和長度-1
{
    int i;
    //至少有兩個元素才進(jìn)行排序
    if(left < right)
    {
        i = (left + right) / 2;
        MergeSort(r, left, i);  //前半部分遞歸
        MergeSort(r, i + 1, right); //后半部分遞歸        
        merge(r, left, right);  //10個數(shù)的比較順序?yàn)閇0,1][0,2][3,4][0,4][5,6][5,7][8,9][5,9][0,9]
    }
}

桶排序

void insert(list<int> &bucket, int val)
{
    auto iter = bucket.begin();
    while(iter != bucket.end() && val >= *iter)
        ++iter;
    //insert會在iter之前插入數(shù)據(jù)顽决,這樣可以穩(wěn)定排序
    bucket.insert(iter, val);
}

void BuckdeSort(vector<int> &arr)
{
    int len = arr.size();
    if(len <= 1)
        return;
    int min = arr[0], max = min;
    for(int i = 1; i < len; ++i)  //找出最小值和最大值
    {
        if(min > arr[i])
            min = arr[i];
        if(max < arr[i])
            max = arr[i];
    }
    
    int k = 10;  //桶的大小
    
    //向上取整,例如[0,9]有10個數(shù)崇摄,就有(9-0)/k+1=1個桶
    int bucketsNum = (max - min) / k + 1;  //桶的個數(shù)
    
    vector<list<int>> buckets(bucketsNum);
    for(int i = 0; i < len; ++i)
    {
        int  value = arr[i];
        //(value-min)/k就是在哪個桶里面
        insert(buckets[(value-min)/k], value);  //將數(shù)據(jù)放到各個桶里并排序
    }
    
    int index = 0;
    for(int i = 0; i < bucketsNum; ++i)
    {
        if(buckets[i].size())
        {
            for(auto &value : buckets[i])
                arr[index++] = value;
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擎值,一起剝皮案震驚了整個濱河市逐抑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屹蚊,老刑警劉巖厕氨,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汹粤,居然都是意外死亡命斧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門嘱兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來国葬,“玉大人,你說我怎么就攤上這事芹壕』闼模” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵踢涌,是天一觀的道長通孽。 經(jīng)常有香客問我,道長睁壁,這世上最難降的妖魔是什么背苦? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮潘明,結(jié)果婚禮上行剂,老公的妹妹穿的比我還像新娘。我一直安慰自己钳降,他們只是感情好厚宰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牲阁,像睡著了一般固阁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上城菊,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天备燃,我揣著相機(jī)與錄音,去河邊找鬼凌唬。 笑死并齐,一個胖子當(dāng)著我的面吹牛漏麦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播况褪,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撕贞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了测垛?” 一聲冷哼從身側(cè)響起捏膨,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎食侮,沒想到半個月后号涯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锯七,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年链快,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眉尸。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡域蜗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出噪猾,到底是詐尸還是另有隱情霉祸,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布畏妖,位于F島的核電站脉执,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏戒劫。R本人自食惡果不足惜半夷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅细。 院中可真熱鬧巫橄,春花似錦、人聲如沸茵典。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽统阿。三九已至彩倚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扶平,已是汗流浹背帆离。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留结澄,地道東北人哥谷。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓岸夯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親们妥。 傳聞我的和親對象是個殘疾皇子猜扮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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