zoukankan      html  css  js  c++  java
  • 第六章-快速排序、合并排序

    哔哩哔哩数据结构讲解地址: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;
    }
  • 相关阅读:
    JavaScript 面向对象的编程(二) 类的封装
    js 防止重复提交表单
    JavaScript 面向对象的编程(一)
    layui laypage 当前页刷新问题
    jquery 选中设置的值
    突然觉得前端js挺不错的
    centos6.8 安装gitlab记录
    3/25/2018 学**况
    Threading、multiprocessing
    正则表达式 RegEx(Regular Expression)
  • 原文地址:https://www.cnblogs.com/xwxz/p/11867812.html
Copyright © 2011-2022 走看看