八大排序整理

八大排序算法

image.png

算法分析

1. 直接插入排序:

在遍歷數(shù)組元素的時(shí)候般堆,當(dāng)前元素 array[i] 從當(dāng)前位置從右向左查找在孝,直到找到正確的位置,使得該元素插入后能夠得到從 0 到 i 有序的數(shù)組淮摔;


image.png

如圖:

  1. i = 1 時(shí)私沮,當(dāng)前元素 3 和 它前面(下標(biāo) j = i - 1 到 j = 0)的元素比較,因?yàn)?9 > 3 ,所以 9 右移一位(array[j + 1] = array[j])仔燕; j 到頭了造垛,所以將 3 插入到位置 (j = 0);此時(shí)晰搀,array = [3, 9, 0, 7, 2, 1]五辽;
  2. i = 2 時(shí),當(dāng)前元素 0 和 它前面(下標(biāo) j = i - 1 到 j = 0)的元素比較外恕,因?yàn)?9 > 0 杆逗,所以 9 右移一位(array[j + 1] = array[j]);因?yàn)?3 > 0 鳞疲,所以 3 右移一位(array[j + 1] = array[j])罪郊, j 到頭了,所以將 0 插入到位置 (j = 0)尚洽;此時(shí)悔橄,array = [0, 3, 9, 7, 2, 1];
  3. i = 3 時(shí)腺毫,當(dāng)前元素 7 和 它前面(下標(biāo) j = i - 1 到 j = 0)的元素比較癣疟,因?yàn)?9 > 7 ,所以 9 右移一位(array[j + 1] = array[j])潮酒;因?yàn)?3 < 7 睛挚,所以將 7 插入 3 的右面,即位置(j + 1 = 2)急黎;此時(shí)竞川,array = [0, 3, 7, 9, 2, 1];
    重復(fù)上述插入過程叁熔,直到數(shù)組的最后一個(gè)元素插入結(jié)束,排序完成床牧。

程序設(shè)計(jì)

class solution {
public:
    void insert_sort(vector<int> &array) {  // 直接插入排序
        int index;
        for (int i = 1; i < array.size(); i++) {
            int temp = array[i];
            for (int j = i - 1; j >= 0; j--) {
                if(temp < array[j]){
                    array[j + 1] = array[j];
                    index = j;
                }
                else {
                    index = j + 1;
                    break;
                }
            }
            array[index] = temp;
        }
    }

好了荣回,接下來我們分析下直接插入排序的時(shí)間復(fù)雜度:
首先分析直接插入排序時(shí)間復(fù)雜度的最好情況:
其實(shí)從程序上就不難看出,讓程序中的for (int j = i - 1; j >= 0; j--) 循環(huán)始終走 else 的條件分支就行了戈咳,令數(shù)組初始時(shí)就是小到大遞增的有序數(shù)組(1, 2, 3, 4, 5)或者數(shù)組中所有元素都相等(6, 6, 6, 6, 6)心软,此時(shí)的時(shí)間復(fù)雜度為O(n);
最壞的情況就是每次當(dāng)前元素的插入位置都是數(shù)組頭元素,令數(shù)組初始時(shí)就是從大到小遞減的有序數(shù)組(5, 4, 3, 2, 1)著蛙,此時(shí)的時(shí)間復(fù)雜度為O(n2)删铃。

2. 希爾排序:

to be continue

#include <iostream>
#include <vector>

using namespace std;

class solution {
public:
    void insert_sort(vector<int> &array) {  // 直接插入排序
        int index;
        for (int i = 1; i < array.size(); i++) {
            int temp = array[i];
            for (int j = i - 1; j >= 0; j--) {
                if(temp < array[j]){
                    array[j + 1] = array[j];
                    index = j;
                }
                else {
                    index = j + 1;
                    break;
                }
            }
            array[index] = temp;
            //for (int i = 0; i < array.size(); i++) {
            //  cout << array[i] << ' ';
            //}
            //cout << endl;
        }
    }
    void shell_sort(vector<int> &array) {  // 希爾(shell)排序
        int step = array.size() / 2;
        int index;
        while (step != 0) {
            for (int i = step; i < array.size(); i++) {
                int temp = array[i];
                for (int j = i - step; j >= 0; j -= step) {
                    if (temp < array[j]) {
                        array[j + step] = array[j];
                        index = j;
                    }
                    else {
                        index = j + step;
                        break;
                    }
                }
                array[index] = temp;
            }
            step = step / 2;
            //for (int i = 0; i < array.size(); i++) {
            //  cout << array[i] << ' ';
            //}
            //cout << endl;
        }
    }
    void select_sort(vector<int> &array) {  // 簡(jiǎn)單選擇排序
        int min_array;
        int index;
        for (int i = 0; i < array.size(); i++) {
            min_array = array[i];
            index = i;
            for (int j = i + 1; j < array.size(); j++) {
                if (array[i] > array[j]) {
                    min_array = array[j];
                    index = j;
                }
            }
            array[index] = array[i];
            array[i] = min_array;
            //for (int i = 0; i < array.size(); i++) {
            //  cout << array[i] << ' ';
            //}
            //cout << endl;
        }
    }
    void heap_sort(vector<int> &array) {  // 堆排序
        int len = array.size();
        int index = len / 2 - 1;
        for (int i = index; i >= 0; i--) {
            creat_heap(array, i, len);
        }
        for (int i = len - 1; i >= 1; i--) {
            swap(array[0], array[i]);
            creat_heap(array, 0, i);
        }

    }
    void quick_sort(vector<int> &array, int left, int right) {  // 快速排序
        if (left < right) {
            int i = left;
            int j = right;
            int pivot = array[i];
            while (i < j) {
                while (i < j && array[j] >= pivot) {
                    j -= 1;
                }
                if (i < j) {
                    array[i] = array[j];
                    i += 1;
                }
                while (i < j && array[i] <= pivot) {
                    i += 1;
                }
                if (i < j) {
                    array[j] = array[i];
                    j -= 1;
                }
            }
            array[i] = pivot;
            //for (int i = 0; i < array.size(); i++) {
            //  cout << array[i] << ' ';
            //}
            //cout << endl;
            quick_sort(array, left, i - 1);
            quick_sort(array, i + 1, right);
        }
    }
    void bubble(vector<int> &array) {  // 冒泡排序
        for (int i = 1; i < array.size(); i++) {
            for (int j = 0; j < array.size() - i; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
            //for (int i = 0; i < array.size(); i++) {
            //  cout << array[i] << ' ';
            //}
            //cout << endl;
        }
    }
    void merge_sort(vector<int> &array) {  // 歸并排序
        if (array.size() < 2) {
            return;
        }
        int mid = array.size() / 2;
        vector<int> array_1;
        vector<int> array_2;
        for (int i = 0; i < mid; i++) {
            array_1.push_back(array[i]);
        }
        for (int i = mid; i < array.size(); i++) {
            array_2.push_back(array[i]);
        }
        merge_sort(array_1);
        merge_sort(array_2);
        array.clear();
        merge_two_array(array_1, array_2, array);
        //for (int i = 0; i < array.size(); i++) {
        //  cout << array[i] << ' ';
        //}
        //cout << endl;
    }
private:
    void creat_heap(vector<int> &array, int index, int len) {  //堆排序構(gòu)建堆
        int left = 2 * index + 1;
        int right = 2 * index + 2;
        int max_node_index = index;
        if (left < len && array[max_node_index] < array[left]) {
            max_node_index = left;
        }
        if (right < len && array[max_node_index] < array[right]) {
            max_node_index = right;
        }
        if (max_node_index != index) {
            swap(array[index], array[max_node_index]);
            creat_heap(array, max_node_index, len);
        }
        //for (int i = 0; i < array.size(); i++) {
        //  cout << array[i] << ' ';
        //}
        //cout << endl;
    }
    void merge_two_array(vector<int> &array_1, vector<int> &array_2, vector<int> &array) {  // 歸并排序合并
        int i = 0;
        int j = 0;
        while (i < array_1.size() && j < array_2.size()) {
            if (array_1[i] < array_2[j]) {
                array.push_back(array_1[i]);
                i += 1;
            }
            else {
                array.push_back(array_2[j]);
                j += 1;
            }
        }
        while (i < array_1.size()) {
            array.push_back(array_1[i]);
            i += 1;
        }
        while (j < array_2.size()) {
            array.push_back(array_2[j]);
            j += 1;
        }
    }
};

int main() {
    int n;
    while (cin >> n && n != 0) {
        vector<int> array(n);
        for (int i = 0; i < n; i++) {
            cin >> array[i];
        }
        solution s;
        //s.insert_sort(array);
        //s.shell_sort(array);
        //s.select_sort(array);
        s.heap_sort(array);
        //s.quick_sort(array, 0, n - 1);
        //s.bubble(array);
        //s.merge_sort(array);
        for (int i = 0; i < array.size(); i++) {
            cout << array[i] << ' ';
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踏堡,隨后出現(xiàn)的幾起案子猎唁,更是在濱河造成了極大的恐慌,老刑警劉巖顷蟆,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫隅,死亡現(xiàn)場(chǎng)離奇詭異腐魂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逐纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門蛔屹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豁生,你說我怎么就攤上這事兔毒。” “怎么了甸箱?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵育叁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我摇肌,道長(zhǎng)擂红,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任围小,我火速辦了婚禮昵骤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肯适。我一直安慰自己变秦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布框舔。 她就那樣靜靜地躺著蹦玫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刘绣。 梳的紋絲不亂的頭發(fā)上樱溉,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音纬凤,去河邊找鬼福贞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛停士,可吹牛的內(nèi)容都是我干的挖帘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恋技,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拇舀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜻底,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤骄崩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刁赖,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搁痛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宇弛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸡典。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枪芒,靈堂內(nèi)的尸體忽然破棺而出彻况,到底是詐尸還是另有隱情,我是刑警寧澤舅踪,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布纽甘,位于F島的核電站,受9級(jí)特大地震影響抽碌,放射性物質(zhì)發(fā)生泄漏悍赢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一货徙、第九天 我趴在偏房一處隱蔽的房頂上張望左权。 院中可真熱鬧,春花似錦痴颊、人聲如沸赏迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌杀。三九已至,卻和暖如春泻仙,著一層夾襖步出監(jiān)牢的瞬間糕再,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工玉转, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亿鲜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓冤吨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親饶套。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漩蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 某次二面時(shí),面試官問起Js排序問題妓蛮,吾絞盡腦汁回答了幾種怠李,深感算法有很大的問題,所以總計(jì)一下! 排序算法說明 (1...
    流浪的先知閱讀 1,192評(píng)論 0 4
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,341評(píng)論 0 2
  • 1. volatile在程序設(shè)計(jì)中有什么作用捺癞? 為提高存取速度夷蚊,編譯器優(yōu)化有時(shí)會(huì)把變量讀取到寄存器中,當(dāng)以后再使用...
    saviochen閱讀 721評(píng)論 0 3
  • 當(dāng)我們?yōu)g覽某個(gè)網(wǎng)頁時(shí),發(fā)現(xiàn)這網(wǎng)頁的內(nèi)容很精彩唐础,想要保存下來箱歧,但是卻沒法打印下來。這時(shí)候一膨,你可以選擇將網(wǎng)頁保存為PD...
    追思人別後閱讀 14,983評(píng)論 1 1
  • 今天他問我呀邢,他的腰是不是太細(xì)了? 我想了想豹绪,我以前覺得細(xì)价淌,現(xiàn)在卻覺得剛剛好。 可以抱的緊緊的可以聽到他的心跳瞒津,那心...
    兔子安閱讀 249評(píng)論 0 0