快速排序和归并排序的实现

归并排序:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void Merge(int a[],int l,int m,int r,int b[]){
    int pos,p1,p2;
    pos = 0,p1 = l,p2 = m+1;
    while(p1 <= m && p2 <= r){
        if(a[p1] < a[p2])
            b[pos++] = a[p1++];
        else
            b[pos++] = a[p2++];
    }
    while(p1 <= m)  b[pos++] = a[p1++];
    while(p2 <= r)  b[pos++] = a[p2++];
    pos = 0;
    for(int i=l;i<=r;i++)
        a[i] = b[pos++];
}
void MergeSort(int a[],int l,int r,int b[]){
    if(l < r){
        int m = (l+r)/2;
        MergeSort(a, l, m, b);
        MergeSort(a,m+1,r,b);
        Merge(a,l,m,r,b);
    }
}
int main(void){
    int a[30],b[30];
    srand((unsigned)time(NULL));
    printf("排序前元素为:");
    for(int i=1;i<=10;i++){
        a[i] = rand() % 100;
        printf("%d ",a[i]);
    }
    printf("\n");
    MergeSort(a, 1, 10, b);
    printf("排序后元素为:");
    for(int i=1;i<=10;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

快速排序:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

void QuickSort(int a[],int l,int r){
    if(l >= r)  return;
    int tem = a[l];
    int i = l,j = r;
    while(i != j){
        while(a[j] >= tem && j > i)
            j--;
        swap(a[i],a[j]);//在右边找到一个比tem小的数把tem放进去,并把小的数放到左边
        while(a[i] <= tem && i < j)
            i++;
        if(i < j)
        swap(a[i],a[j]);//从左边找到一个比tem大的数把ten放进去,并把大的数放到右边
        //完成这一步时a[i] = k;
    }
    //到i == j时就时左边的都比tem小,右边的都比tem大。
    QuickSort(a,l, i);
    QuickSort(a,i+1, r);
}
int main(void){

    srand((unsigned)time(NULL));
    int a[30];
    printf("排序前为:");
    for(int i=1;i<=10;i++){
        a[i] = a[i] % 100;
        printf("%d ",a[i]);
    }
    printf("\n");
    QuickSort(a,1,10);
    printf("排序后为:");
    for(int i=1;i<=10;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

快速排序一般情况下是O(nlogn)的,如果一个数组已经接近有序,那么快排就回很慢接近O(n^2).越乱的序列快排比较快。而归并则比较稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值