八大排序整理

八大排序算法

image.png

算法分析

1. 直接插入排序:

在遍历数组元素的时候,当前元素 array[i] 从当前位置从右向左查找,直到找到正确的位置,使得该元素插入后能够得到从 0 到 i 有序的数组;


image.png

如图:

  1. i = 1 时,当前元素 3 和 它前面(下标 j = i - 1 到 j = 0)的元素比较,因为 9 > 3 ,所以 9 右移一位(array[j + 1] = array[j]); j 到头了,所以将 3 插入到位置 (j = 0);此时,array = [3, 9, 0, 7, 2, 1];
  2. i = 2 时,当前元素 0 和 它前面(下标 j = i - 1 到 j = 0)的元素比较,因为 9 > 0 ,所以 9 右移一位(array[j + 1] = array[j]);因为 3 > 0 ,所以 3 右移一位(array[j + 1] = array[j]), j 到头了,所以将 0 插入到位置 (j = 0);此时,array = [0, 3, 9, 7, 2, 1];
  3. i = 3 时,当前元素 7 和 它前面(下标 j = i - 1 到 j = 0)的元素比较,因为 9 > 7 ,所以 9 右移一位(array[j + 1] = array[j]);因为 3 < 7 ,所以将 7 插入 3 的右面,即位置(j + 1 = 2);此时,array = [0, 3, 7, 9, 2, 1];
    重复上述插入过程,直到数组的最后一个元素插入结束,排序完成。

程序设计

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 j = i - 1; j >= 0; j--) 循环始终走 else 的条件分支就行了,令数组初始时就是小到大递增的有序数组(1, 2, 3, 4, 5)或者数组中所有元素都相等(6, 6, 6, 6, 6),此时的时间复杂度为O(n);
最坏的情况就是每次当前元素的插入位置都是数组头元素,令数组初始时就是从大到小递减的有序数组(5, 4, 3, 2, 1),此时的时间复杂度为O(n²)。

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) {  // 简单选择排序
        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) {  //堆排序构建堆
        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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,191评论 0 4
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • 1. volatile在程序设计中有什么作用? 为提高存取速度,编译器优化有时会把变量读取到寄存器中,当以后再使用...
    saviochen阅读 721评论 0 3
  • 当我们浏览某个网页时,发现这网页的内容很精彩,想要保存下来,但是却没法打印下来。这时候,你可以选择将网页保存为PD...
    追思人别後阅读 14,983评论 1 1
  • 今天他问我,他的腰是不是太细了? 我想了想,我以前觉得细,现在却觉得刚刚好。 可以抱的紧紧的可以听到他的心跳,那心...
    兔子安阅读 249评论 0 0