• 各种排序算法总结


    1.插入排序

    //插入排序
    void inssort(int a[],int n) {
        //一个元素天然就是排好序的,所以i从1开始循环
        for (int i = 1; i < n; i++) {
            //后面的比前面相邻的元素小,交换这两个元素
            for (int j = i; j > 0 && (a[j] < a[j - 1]); j--)
                swap(a[j], a[j - 1]);
        }
    }
    2.冒泡排序
    //冒泡排序
    //第i次循环,保证前面i个元素是有序的
    
    void bubsort(int a[], int n) {
        for (int i = 0; i < n; i++) {
            //j每次都从末尾开始循环,如果前面相邻的元素比后面大,就交换这两个元素,直至j=i为止
            for (int j = n - 1; j>i; j--) {
                if (a[j] < a[j - 1])
                    swap(a[j], a[j - 1]);
            }
        }
    }
    3.选择排序
    //选择排序
    //第i次循环找第i小的元素
    void selection(int a[], int n) {
        for (int i = 0; i < n - 1; i++) {
            int min = i;
            for (int j = i+1; j < n; j++) {
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            swap(a[i], a[min]);
        }
    }
    4.快速排序
    int partition(int a[], int l, int r, int &pivot) {
        while (l < r) {
            while (a[l] < pivot)//找到a[l]>=pivot
                l++;
            while (r > l&&a[r] >= pivot)//找到a[r]<piovt
                r--;
            swap(a[l], a[r]);//交换a[l],a[r]
        }//l和r相遇的位置就是划分点最后该待在的位置
        return l;
    }
    
    //快速排序
    void qsort(int a[], int i, int j) {
        if (i>=j)
            return;
        //取哪个位置作为划分点
        int pivotindex = (i + j) / 2;
        //将划分点元素移到数目末尾
        swap(a[pivotindex], a[j]);
        //调用partition函数,保证k左边的元素比a[j]小,右边的元素比a[j]大(或者等于)
        int k = partition(a, i, j, a[j]);
        //将pivot移动到合适的位置
        swap(a[k], a[j]);
        //递归对pivot左右半边数组调用qsort函数
        qsort(a,i,k-1);
        qsort(a, k + 1, j);
    }
    5.归并排序
    //归并排序
    void mergesort(int a[],int l,int r) {
        if (l >=r)
            return;
        int mid = (l + r) / 2;
        //递归对左右半边进行排序
        mergesort(a, l, mid);
        mergesort(a, mid + 1, r);
        //用于排序的辅助数组,其左半边和a[l->mid]一致,右半边则是a[r->mid],保证了中间大,两边小
        int *temp = new int[r + 1];
        //复制左半边的数组
        for (int i = l; i <= mid; i++) 
            temp[i] = a[i];
        //复制右半部分的数组,注意顺序要反过来
        int j = mid + 1;
        for (int i = r ; i > mid; i--) {
            temp[j++] = a[i];
        }
        //从辅助数组两边,选择较小的那个数作为排序后的第k个元素
        for (int i = l, j = r, k = l; k <= r; k++) {
            if (temp[i] < temp[j])
                a[k] = temp[i++];
            else
                a[k] = temp[j--];
        }
    }
    6.堆排序
    class max_heap {
    public:
        int *a;
        int n;
        int size;
        max_heap(int a[], int n) {//构造函数
            this->a = a;
            this->n = n;
            size = n;
            //建堆
            for (int i = n / 2-1; i > -1; i--)
                siftdown(i);
        }
        void heapsort() {
            while(n>0){//当剩余元素大于0个
                swap(a[0], a[--n]);//当前最大的元素和数组末尾元素交换
                siftdown(0);//对调换之后的根节点元素进行siftdown处理
            }
        }
        
        void siftdown(int pos) {//l=2*pos+1,r=2*pos+2
            while ((2 * pos + 1) < n) {
                int l = 2 * pos + 1;
                int r = l + 1;
                if (r<n&&a[r]>a[l])//l代表叶子节点中较大的那一个的下标
                    l = r;
                if (a[l] > a[pos]) {//如果根节点比叶子节点中较大的那个小
                    swap(a[l], a[pos]);//交换
                    pos = l;//继续处理下一层节点
                }
                else
                    break;
            }
        }
            void print() {//输出数组中的所有元素
                for (int i = 0; i < size; i++)
                    cout << a[i] << " ";
                cout << endl;
            }    
    
    };  



  • 相关阅读:
    Android-Java-构造方法内存图
    redis conf 详解
    redis windows 下安装及使用
    Python 学习笔记(一)
    python 配置
    win 7 下vim的使用
    window下安装Node.js NPM
    HashMap实现原理(转)
    mysql 常用功能
    MySql配置
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5008080.html
Copyright © 2020-2023  润新知