• 排序算法比较总结


    冒泡排序

    每次从头开始(每次结束可以不到最后,因为上一次已经确定最大值在末尾了),比较相邻两个数,每次下沉一个最大值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
      #include <iostream>
    using namespace std;
     
    void bubbleSort(int a[], int length)
    {
        bool swapFlag;
        for (int i = 1; i < length; i++)  //两个数,冒泡排序1次;length个数,冒泡排序length-1次。
        {
            swapFlag = false;
            for (int j = 0; j < length - i; j++) //注意终止条件length-i,每次下沉一个最大数,不用比较到最后已确定的数。
            {
                if (a[j] > a[j+1])
                {
                    swapFlag = true;
                    swap(a[j], a[j+1]);
                }
            }
     
            if (swapFlag == false)
            {
                break;
            }
        }
    }
     
    int main() {
        int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20};
     
        bubbleSort(array,9);
     
        for (int i = 0; i < 9; i++)
        {
            cout << array[i] << endl;
        }
        return 0;
    }

    插入排序

    将数插入到已排序数组中。

    image

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
      #include <iostream>
    #include <vector>
    using namespace std;
     
    template <class T>
    void insertSort(vector<T> &vec)
    {
     
        for (int i = 1; i < vec.size(); i++)
        {
            int j;
            T tmp = vec[i];
     
            for (j = i; (j > 0) && (tmp < vec[j-1]); j—) //是后移,不是交换。
            {
                vec[j]=vec[j-1];
            }
     
            vec[j] = tmp;
        }
    }
     
    int main()
    {
        int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20};
        vector<int> intVec(array, array + 9);
        insertSort(intVec);
     
        for (vector<int>::iterator iter = intVec.begin(); iter != intVec.end(); iter++) {
            cout << *iter << endl;
        }
    }

    希尔排序

    缩减增量排序,特殊的插入排序,每个增量的排序都是插入排序。

    image

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
      #include <iostream>
    #include <vector>
    using namespace std;
     
    void shellSort(vector<int> &a, int length)
    {
        for (int gap = length / 2; gap > 0; gap /= 2)
        {
            for (int i = gap; i < length; i++)
            {
                int j;
                int tmp = a[i];
     
                for (j = i; (j - gap >= 0) && (tmp < a[j-gap]); j -= gap)
                {
                    a[j] = a[j-gap];
                }
                a[j] = tmp;
            }
        }
    }
     
     
    int main() {
        int a[] = {9,8,7,6,5,4,3,2,1,0,11};
        vector<int> vec(a, a+11);
        shellSort(vec, 11);
     
     
        for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) {
            cout << *iter << endl;
        }
     
        return 0;
    }

    快速排序

    image

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
      #include <iostream>
    #include <vector>
    using namespace std;
     
    void quicksort(vector<int> &v, int left, int right)
    {
        if (left >= right)
        {
            return;
        }
     
        int low = left;
        int high = right;    //right是结束位,right-1是倒数第一个数。
        int pivot = v[low];  //第一个值作为中枢值。
     
        while (low < high)
        {
            while (low < high && v[--high] > pivot)//--high从倒数第一个数向前找到第一个不大于key的值。
                NULL;
            while (low < high && v[++low] < pivot)//从第2个数(v[low+1])向后找到第一个不小于key的值(v[low]是中枢值,不参与排序).
                NULL;
     
            if (low < high)
            {
                swap(v[low], v[high]);
            }
            else
            {
                break;
            }
        }
     
        swap(v[low], v[left]); //将中枢值与不大于中枢值的最大值交换,至此,v[low]是本次排序中枢值,low左边的数都不大于中枢值,low右边的数都不小于中枢值。
        quicksort(v, left, low);
        quicksort(v, low + 1, right);
    }
     
    int main()
    {
        int a[10] =     { 9,8,7,9,5,4,3,2,1,0 };
     
        vector<int> vec(a, a + 10);
        quicksort(vec, 0, 10);
        for (vector<int>::iterator iter = vec.begin(); iter != vec.end();iter++)
        {
            cout << *iter << endl;
        }
     
        return 0;
    }

    排序算法比较

    image

  • 相关阅读:
    网络管理工具:Wireshark
    WAP header 信息的意义
    Visual Studio 2005 发布网站提示发布成功 但指定文件夹下没任何文件问题的解决
    Hello Win
    [转]手把手教你卸载oracle 10g
    如何识别 SQL Server 的版本
    生成insert sql脚本的存储过程
    JQuery触发事件
    PHP事务的使用方法
    PHP session和cookie
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3176458.html
Copyright © 2020-2023  润新知