一些排序总结

冒牌排序

升序:进行n-1次操作,每次从最后一位开始,如果 a[j]<a[j-1] ,不是升序就交换,每次都能将 [i,n-1] 最小的值放到第i位。
for(int i=0 ; i < n-1 ; ++i)
    {
        bool flag=true;
        for(int j = n - 1 ; j > i ; --j)
        {
            if(a[j] < a[j-1])    //升序
            {
                swap(a[j], a[j-1]);
                flag = false;
            }
        }
        if(flag)break;
    }

归并排序

分治->排序->合并
详解:https://blog.csdn.net/qq_43601282/article/details/96991589
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MA=1e5+5;
int a[MA],temp[MA];

void mergearray(int l,int mid,int r){
    int i=l,j=mid+1;
    int k=0;
    while(i<=mid&&j<=r){
        if(a[i]<=a[j])temp[k++]=a[i++];
        else temp[k++]=a[j++];
        //求逆序数
        /*
        if(a[i]>a[j]){
	      temp[k++]=a[j++];
	      ans+=mid-i+1;
	}
	else temp[k++]=a[i++];
        */
    }
    while(i<=mid)temp[k++]=a[i++];
    while(j<=r)temp[k++]=a[j++];
    for(int i=0;i<k;i++)
            a[l+i]=temp[i];
}
void mergesort(int l,int r){
    if(l<r){
        int mid=(l+r)/2;
        mergesort(l,mid);       //分治
        mergesort(mid+1,r);
        mergearray(l,mid,r);    //合并
    }
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    mergesort(0,n-1);
    for(int i=0;i<n;i++){
        if(i==n-1)printf("%d\n",a[i]);
        else printf("%d ",a[i]);
    }
    return 0;
}

快速排序

利用分治的方法,取一个数为基准,i从left-1开始加,直到遇到大于基准的,j从right+1开始减,直到遇到小于基准的
如果此时i<j,则交换,这样循环之后,基准左边都为小于它的,右边都为大于它的,这时再分治处理左右就好了。
void quicksort(int l,int r){
    if(l>=r)return ;
    int x=a[(l+r)/2];
    int i=l-1,j=r+1;
    while(i<j){
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)swap(a[i],a[j]);
    }
    quicksort(l,j);
    quicksort(j+1,r);
}

posted @ 2020-02-22 22:13  w_w_t  阅读(113)  评论(0编辑  收藏  举报