归并排序算法、快速排序算法、插入排序、二分插入排序的C++实现

#include <QCoreApplication>

int Rand[1000];
int Rank[1000];
int Tn = 0;

void Merge(int low, int mid, int high)
{
    //主要用于比较[low, mid]-[mid+1, high]两个数组的内容的大小并进行排列
    int i = low, j = mid+1, k = low;
    while (i<=mid && j<=high) {
        Tn +=3;
        if(Rand[i]<Rand[j]){
            Rank[k] = Rand[i];
            i++;
            Tn +=2;
        }
        else {
            Rank[k] = Rand[j];
            j++;
            Tn +=1;
        }
        k++;
    }
    if(i>mid){
        for(j;j<=high;j++){
            Rank[k] = Rand[j];
            k++;
            Tn +=3;
        }
    }
    else {
        for(i;i<=mid;i++){
            Rank[k] = Rand[i];
            k++;
            Tn +=3;
        }
    }
    for(i = low;i <= high; i++){
        Rand[i] = Rank[i];
        Tn +=2;
    }
}


void MergeSort(int low, int high)
{
    int mid;
    //归并排序的思想:递归把数组拆分成N/2项,Merge函数排序两块的大小
    if (low < high)
    {
        Tn +=2;
        mid = (low + high)/2;
        MergeSort(low, mid);
        MergeSort(mid+1, high);
        Merge(low, mid, high);
    }
}

int partition(int low, int high)
{
    int i = low, j = high, temp;

    while(1){
        while(Rand[low] >= Rand[i]){
            i++;
            Tn +=2;
        }
        while(Rand[low] < Rand[j]){
            j--;
            Tn +=2;
        }
        if(i<j){
            temp = Rand[i];
            Rand[i] = Rand[j];
            Rand[j] = temp;
            Tn +=1;
        }
        else {
            temp = Rand[low];
            Rand[low] = Rand[j];
            Rand[j] = temp;
            break;
        }
    }
    return j;
}

void QuickSort(int low, int high)
{
    //用数组的第一个元素把数据分为比该数大的和比该数小的两个部分
    int mid;
    if(low < high){
        Tn +=1;
        mid = partition(low, high);
        QuickSort(low, mid-1);
        QuickSort(mid+1, high);
    }
}

void InSort(int num)
{
    int temp;
    //插入排序:比较每次循环的第一个参数与它之前的参数的大小,插入到合适的位置
    for(int i = 1; i < num; i++){
        for(int j = i; j >= 0; j--){
            if(Rand[j] < Rand[j-1]){
                temp = Rand[j-1];
                Rand[j-1] = Rand[j];
                Rand[j] = temp;
            }
            else {
                break;
            }
        }
    }
}

void ModInSort(int num)
{
    int temp, left = 0, right, mid;
    //改进版插入排序:插入元素A[i]时使用二分查找代替原来的逐个比对
    for(int i = 1; i < num; i++){
        right = i;
        left = 0;
        while (left <= right) {
            mid = (left + right)/2;
            if(Rand[mid] >= Rand[i])
            {
                right = mid - 1;
            }
            else{
                left = mid + 1;
            }
        }
        temp = Rand[i];
        for(int j = i; j > left; j--)
            Rand[j] = Rand[j-1];
        Rand[left] = temp;
    }
}

void main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //随机生成数组
    for(int i =0; i < 1000; i++)
    {
        Rand[i] = rand()%1000;
    }

    ModInSort(10);
//    InSort(10);
//    QuickSort(0, 1000);
//    MergeSort(0, 1000);

    printf("T(n) = %d\n", Tn);
    //输出复杂度
    //n = 100 时,快速排序复杂度:1709, 归并排序复杂度:304
    //n = 1000 时,快速排序复杂度:28413, 归并排序复杂度:3004
    //输出排序结果
    for(int i =0; i < 1000; i++)
    {
        printf("%d\t", Rand[i]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值