zoukankan      html  css  js  c++  java
  • 【基础】排序算法学习笔记

    NOIP范畴常见的排序一般是这几种
    1、冒泡排序,选择排序,插入排序
    2、快速排序,归并排序,堆排序
    3、计数排序,基数排序,桶排序

    前两类是基于比较的,第三类是基于统计的。
    第一类都是O(N^2)的,第二类都是O(NlogN)的。

    //冒泡排序
    //1.相邻的数据两两比较,小数放前面,大数放后面
    //2.这样每一次操作过后最小的数就被排在了最前面
    void BubbleSort(int a[], int n){
        for(int i = 1; i < n; i++){ //循环有序数组,每次循环后保证到i位置的值是有序的。
            for(int j = n; j > i; j--) //循环无序数组两两比较
                if(a[j] < a[j-1])swap(a[j],a[j-1]); //如果是逆序对就交换(保证每次把最小的值往前交换)
            //Print(a,n);
        }
    }
    //插入排序
    //1.数据分为两部分,一开始有序部分包含1个元素
    //2.依次将无序部分的元素插入到有序部分当中
    void InsertSort(int a[], int n){  //直接插入排序
        for(int i = 2; i <= n; i++){ //遍历无序部分,每次取出第一个元素
            int j = i-1, k = a[i];  //j为当前下标, k为无序部分第一个元素
            while(j>=1 && k<a[j]){ //找到k元素在有序部分的位置
                a[j+1] = a[j];    //循环的时候直接右移有序数组,为k腾出位置
                j--;             //不是k正确的位置,继续往前循环
            }
            a[j+1] = k;  //出来的时候j多减了1,要加回去
            //for(int i = 1; i <= n; i++)cout<<a[i]<<" ";  cout<<"
    ";
        }
    }
    //选择排序
    //1.在未排序序列中找到最小的元素,记录位置
    //2.将它放到已排序序列的末尾(和第一个无序元素交换即可)
    void SelecSort(int a[], int n){
        for(int i = 1; i <= n; i++){ //对于每一个位置的值(实质是未排序序列的第一个元素)
            int index = i;  //index:记录未排序序列中最小元素的位置
            for(int j = i+1; j <= n; j++) //遍历剩余未排序序列
                if(a[j] < a[index])index = j; //保证index是最小元素的位置
            swap(a[i],a[index]);//将最小的值放到未排序序列的第一个,完成排序
            //for(int i = 1; i <= n; i++)cout<<a[i]<<" ";  cout<<"
    ";
        }
    }
    //快速排序
    //1.每次选择一个基准数,把比之小的都放到其左边,大的都放到其右边
    //2.排放时候的细节
    void QuickSort(int a[], int n, int l, int r){
        if(l > r)return ; //递归出口,越界返回
        int k = a[l];//k就是基准数(k的选取与内循环的找数顺序有关)
        int i = l, j = r;//区间
        while(i < j){ //i==j时,两数相遇,
            //顺序有影响,先从右往左找,找到第一个比基准数小的位置
            while(i<j && a[j]>=k)j--;//切记‘>=’(可以忽略掉与k相等的值,不然i永远不会大于j,则死循环)
            //然后从左往右找到第一个比基准数大的位置
            while(i<j && a[i]<=k)i++;
            //如果他们没有相遇,就交换这两个数的位置,并继续寻找
            if(i < j)swap(a[i],a[j]);
        }
        //将基准数归位
        a[l] = a[i];  //相遇的位置
        a[i] = k;    //
        QuickSort(a,n,l,i-1);//递归后不用考虑基准数
        QuickSort(a,n,i+1,r);
    }

    给出对比
    这里写图片描述

    更多的占坑待填。。。

  • 相关阅读:
    Saltstack module apache 详解
    Saltstack module ip 详解
    Saltstack module iosconfig 详解
    Saltstack module introspect 详解
    Saltstack module inspector 详解
    Saltstack module ini 详解
    Saltstack module incron 详解
    Modbus 指令 RS485指令规则
    停车系统对接第三方在线支付平台(二)
    停车系统对接第三方在线支付平台
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444763.html
Copyright © 2011-2022 走看看