• 第六章-快速排序、合并排序


    哔哩哔哩数据结构讲解地址:https://space.bilibili.com/356198029

    视频讲解过程地址:https://www.bilibili.com/video/av75201323

    快速排序

    #include<iostream>
    using namespace std;
    void quicksort(int[], int, int);
    int partition(int[], int, int);
    int main()
    {
        int array [] = {55,2,6,4,32,12,9,73,26,37};
    
        int len = sizeof(array) / sizeof(int);
    
        cout<<"输入的原始序列:  ";
        for(int i=0; i<len; i++) // 输出原序列
            cout<<array[i]<<",";
        cout<<endl<<endl;
    
        quicksort(array,0, len-1); // 调用排序函数
        cout<<"  ----快速排序结果---- " << endl;
        for(int i=0; i<len; i++)
            cout<<array[i]<<",";
        cout<<endl;
        return 0;
    }
    
    void quicksort(int a[], int left, int right) // 快排算法
    {
        if(left<right)
        {
            int pivotpos = partition(a,left,right); // 排好序的基准元素
            quicksort(a,left, pivotpos-1); // 根据基准元素划分的块,递归
            quicksort(a,pivotpos+1,right); // 根据基准元素划分的块,递归
        }
    
    }
    
    int partition(int a[], int left, int right) // 划分算法,核心
    {
        int pivot = a[left];
        while(left<right) // 两个相遇结束
        {
            while(left<right && a[right] >= pivot) --right; //从每一部分的最后一位开始检查
            if(left<right) a[left++] = a[right]; // 将比基准小的放在基准左侧 结合while说明 right小于pivot
            while(left<right && a[left] <= pivot) ++left; // 从每一部分的最初一位开始检查
            if(left<right) a[right--] = a[left];// 将比基准大的放在基准右侧结合while说明 left大于pivot
        }
        a[left] = pivot; // 将基准元素放在最终的位置上,使得左边都是比他小的,右边都是比他大的
        return left;
    }

    合并排序

    #include<iostream>
    using namespace std;
    
    void Merge(int [], int, int, int, int []);
    // 归并排序划分过程
    void MergeSort(int a[], int left, int right, int temp[])
    {
        if(left < right)
        {
            int mid = (left + right) >> 1;
            MergeSort(a,left,mid,temp);
            MergeSort(a,mid+1,right,temp);
            Merge(a,left,mid,right,temp);
        }
    }
    
    // 归并排序合并过程
    // 将数组下标范围[left,mid]和[mid+1,right]的有序序列合并成一个有序序列
    void Merge(int a[], int left, int mid, int right, int temp[])
    {
        int p0 = 0;
        int p1 = left, p2 = mid + 1;
        // p0指向辅助数组的首位
        // p1指向数组[left,mid]的首位,p2指向数组[mid+1,right]的首位
        // 开始排序,< 先放小元素升序,>降序
        while(p1<=mid && p2<=right)
        {
            if(a[p1] < a[p2])
                temp[p0++] = a[p1++];
            else
                temp[p0++] = a[p2++];
        }
        ////如果还有剩余元素,直接放入到辅助数组中
        while(p1<=mid)
            temp[p0++] = a[p1++];
        while(p2<=right)
            temp[p0++] = a[p2++];
        // 拷贝temp排好顺序的元素到数组a中,
        // 注意数组a是从left开始的,不能默认为0,并且一共有元素right-left+1个元素。
        for(int i=0; i<right-left+1;++i)
            a[left+i] = temp[i];
    }
    int main()
    {
        int array [] = {55,2,6,4,32,12,9,73,26,37};
        int len = sizeof(array) / sizeof(int);
        cout<<"输入的原始序列:  ";
        for(int i=0; i<len; i++) // 输出原序列
            cout<<array[i]<<",";
        cout<<endl<<endl;
    
        cout<<"  ----归并排序结果---- " << endl;
        int *temp = new int [len];
        MergeSort(array,0,len-1,temp); // 调用排序函数
        for(int j=0; j<len; j++)
            cout<<array[j]<<",";
    
        return 0;
    }
  • 相关阅读:
    ffmpeg h264编码 extradata 为空
    MySQL主从复制报错一致性问题解决
    MySQL 子查询优化案例
    RAC+单节点搭建DG
    总结搭建Oracle11g DG踩的坑
    解决开机自动调用脚本失败的问题
    MySQL版本升级之5.6到5.7
    MySQL 通过semi join 优化子查询
    MySQL 配置文件中忘配置default-character-set引发的乱码问题
    MySQL5.6下使用xtrabackup部分备份恢复到MySQL5.7
  • 原文地址:https://www.cnblogs.com/xwxz/p/11867812.html
Copyright © 2020-2023  润新知