排序就是根据记录关键字值得递增或递减顺序将记录的次序进行重新排列使得原来一组次序任意的记录转变为按关键字有序排列的一组记录。如含有n个记录的文件为{R1,R2,R3……},记录对应的关键字值{k1,k2,k3……},确定一种置换关系使关键字值得排序为
ka1<=ka2<=ka3<=……
这种操作即为排序。排序在日常的应用中非常广泛,通常排序有冒泡排序,插入排序,选择排序,快排和归并排序。以下是几种常见排序的总结和整理:
1 冒泡排序,时间复杂度为o(n^2)
#include<iostream>
#include<vector>
using namespace std;
int num[500001];
int st;
int main(){
int n,i,tmp,j,flag;
while(cin>>n != 0){
for(i=0;i<n;i++){
cin>>num[i];
}
st=0;
for(i=n-1;i>0;i--){
flag=0;
for(j=0;j<i;j++){
if(num[j]>num[j+1]){
flag=1;
tmp=num[j];
num[j]=num[j+1];
num[j+1]=tmp;
st++;
}
}
if(!flag)
break;
}
cout<<st<<endl;
}
}
2 插入排序,时间复杂度为o(n^2)
const int M=300;
int a[M];
void insertsort(int n){
int i,j,temp;
for(i=1;i<=n;i++){
temp=a[i];
j=i-1;
while(a[j]>temp&&j>0){
a[j+1]=a[j--];
}
a[j+1]=temp;
}
}
3 选择排序,时间复杂度为o(n^2)
const int M=300;
int a[M];
void selectSort(int n){
int i,j,d;
int temp;
for(i=0;i<=n-1;i++){
d=i;
for(j=i+1;j<=n;j++){
if(a[j]<a[d]){
d=j;
}
if(d!=i){
temp=a[d];
a[d]=a[i];
a[i]=temp;
}
}
}
}
4快排时间复杂度是o(nlogn)
vector<int> num;
void qsort(int start,int end){
if(start<end){
int s=start;
int e=end+1;
int temp;
while(1){
do{
s++;
}while(num[s]<num[start]&&s<end);
do{
e--;
}while(num[e]>num[start]&&e>start);
if(s<e){
temp=num[s];
num[s]=num[e];
num[e]=temp;
}
else
break;
}
temp=num[start];
num[start]=num[e];
num[e]=temp;
qsort(start,e-1);
qsort(e+1,end);
}
}
5归并排序,时间复杂度为o(nlogn)
#include<iostream>
#include<stdio.h>
using namespace std;
const int M=500001;
int n,a[M],t[M];
int sum;
void merge(int start,int mid,int end){
int k=0;
int f=start,s=mid+1;
int fe=mid,se=end;
while(f<=fe&&s<=se){
if(a[f]>a[s]){
t[k++]=a[s++];
sum+=(mid-f+1);
}
else{
t[k++]=a[f++];
}
}
while(f<=fe)
t[k++]=a[f++];
while(s<=se)
t[k++]=a[s++];
for(fe=0;fe<k;fe++)
a[start+fe]=t[fe];
}
void mergeSort(int start,int end){
if(start<end){
int mid=(start+end)/2;
mergeSort(start,mid);
mergeSort(mid+1,end);
merge(start,mid,end);
}
}