zoukankan      html  css  js  c++  java
  • 简单排序

    前提:

      void X_Sort(ElementType A[], int N) 从小到大排序

      N是正整数 只讨论基于比较的排序(> = < 有定义) 只讨论内部排序

      稳定性:任意两个相等的数据,排序前后的位置不发生改变

      没有一种排序是任何情况下都表现最好的

    选择排序:

      无论什么情况都需要N*(N-1)/2次比较,不稳定

      时间复杂度:T = O(N^2)

    冒泡排序:

      对于链表的排序也适用

      最好情况:顺序 T = O(N)

      最坏情况:逆序 T = O(N^2)

      稳定

    插入排序:

      稳定

      最好情况:顺序 T = O(N)

      最坏情况:逆序 T = O(N^2)

    时间复杂度下界:

      对于下标 i < j, 如果A[i] > A[j], 则称(i, j)是一对逆序对(inversion)

      交换2个相邻元素正好消去1个逆序对(冒泡, 插入)

      插入排序:T(N, i) = O(N+I) 如果序列基本有序,则插入排序简单且高效

      定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对

      定理:任何仅以交换相邻元素来排序的算法的算法,平均时间复杂度为Ω(N^2)

      要提高效率,每次交换不止消去1个逆序对,每次交换相隔较远的2个元素

    代码:

      

    #include <iostream>
    using namespace std;
    typedef long long ElementType;
    
    void Swap(ElementType *a, ElementType *b)
    {
        ElementType temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void Bubble_sort(ElementType A[], int N)
    {
        int P, flag, i;
        for (P=N-1; P >= 0; P--) {
            flag = 0;
            for (i = 0; i < P; i++) {
                if (A[i] > A[i+1]) {
                    Swap(&A[i], &A[i+1]);
                    flag = 1;
                }
            }
            if (flag == 0) break;
        }
    }
    
    void Insertion_Sort(ElementType A[], int N)
    {
        int P, i;
        ElementType Tmp;
        for (P = 1; P < N; P++) {
            Tmp = A[P];
            for (i = P; i > 0 && A[i-1] > Tmp; i--)
                A[i] = A[i-1];
            A[i] = Tmp;
        }
    }
    
    void SimpleSelectionSort(ElementType A[], int N)
    {
        int i, j, temp, Min;
    
        for (i = 0; i < N-1; i++) {
            Min = i;
            for (j = i+1; j < N; j++)
                if (A[j] < A[Min])
                    Min = j;
            if (Min != i)  //第i个元素与最小元素交换
                Swap(&A[Min], &A[i]);
        }
    }
    
    int main()
    {
        int N;
        ElementType A[110000];
        cin >> N;
    
        for (int i = 0; i < N; i++)
            cin >> A[i];
    
        //Bubble_sort(A, N);
        //Insertion_Sort(A, N);
        SimpleSelectionSort(A, N);
        for (int i = 0; i < N-1; i++)
            cout << A[i] << " ";
        cout << A[N-1];
    
        return 0;
    }

    PTA运行结果:

    • 数据1:只有1个元素;
    • 数据2:11个不相同的整数,测试基本正确性;
    • 数据3:103个随机整数; 
    • 数据4:104个随机整数; 
    • 数据5:105个随机整数; 
    • 数据6:105个顺序整数;
    • 数据7:105个逆序整数; 
    • 数据8:105个基本有序的整数;
    • 数据9:105个随机正整数,每个数字不超过1000。

    选择排序:

    冒泡排序:

    插入排序:

  • 相关阅读:
    排序算法(2)-冒泡排序及优化
    [转]Java泛型详解
    [转]Java泛型详解
    02-机器学习_(knn分类算法与应用)
    01-机器学习_(python数据类型详解)
    流量运营项目说明
    数据仓库星型模型vs雪花模型
    数据仓库命名规范
    数据仓库建模
    数据仓库
  • 原文地址:https://www.cnblogs.com/whileskies/p/6863719.html
Copyright © 2011-2022 走看看