冒牌排序
升序:进行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
",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);
}