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

哔哩哔哩数据结构讲解地址: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;
}

猜你喜欢

转载自www.cnblogs.com/xwxz/p/11867812.html