归并排序
1) 把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
每一个子过程都进行归并排序,整体用分治的思想(递归实现)
时间复杂度为O(nlogn)
是最快的排序算法!
/*
函数mergeayyar()是归并排序算法
函数mergesort()是对每个子过程进行归并排序,最后合并成最终的数组
此算法理解分治的思想不难,关键是搞清楚递归是如何实现分治的
也是此类算法的关键
*/
#include<iostream>
using namespace std;
//归并
void mergearray(int a[],int first,int mid,int end,int temp[]){
int i=0,j=0,k=0,m=0,n=0;
i=first;
j=mid+1;
n=mid;
while(i<=n&&j<=end){
if(a[i]<a[j]){
temp[k]=a[i];
i++;
}else{
temp[k]=a[j];
j++;
}
k++;
}
while(i<=n||j<=end){
if(i<=n){
temp[k]=a[i];
i++;
}else if(j<=end){
temp[k]=a[j];
j++;
}
k++;
}
for(int t=0;t<end-first+1;t++){
a[first+t]=temp[t];
}
}
//排序
void mergesort(int a[],int first,int end,int temp[]){
if(first<end){
int mid=first+(end-first)/2;
mergesort(a,first,mid,temp);
mergesort(a,mid+1,end,temp);
mergearray(a,first,mid,end,temp);
}
}
//test
int main(){
int a[7]={25,57,48,37,12,92,86};
int n=7;
int *p=new int[n];
mergesort(a,0,n-1,p);
for(int t=0;t<n;t++){
cout<<a[t]<<" ";
}
delete [] p;
cout<<endl;
return 0;
}
快速排序
1)设k=a[0], 将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可 (O(n)时间完成)
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
时间复杂度O(nlogn)
速度也很快!
感觉这个比归并排序好理解一点…
/*
快速排序很好理解
关键是分析透如何排序就好了
这个程序不是最好的代码结构,不过是笔者自己解的,所以不想借鉴网上的多数的那个while循环的结构
*/
#include<iostream>
using namespace std;
//快速排序
int quickArray(int a[],int first,int end,int n){
int x=a[first];
int i=first,j=end;
int k=first;
while(i<=j){
if(x>a[j]&&k<j){
a[k]=a[j];
a[j]=x;
k=j;
}
if(a[i]>x&&k>i){
a[k]=a[i];
a[i]=x;
k=i;
}
j--;
i++;
}
return k;
}
//递归
void quickSort(int a[],int first,int end,int n){
if(first<end){
int k=quickArray(a,first,end,n);
quickSort(a,first,k-1,n);
quickSort(a,k+1,end,n);
}
}
//test
int main(){
int a[8]={7,1,3,8,12,11,2,9};
int n=sizeof(a)/sizeof(int);
quickSort(a,0,n-1,n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
编译器中自带快速排序函数qsort(),具体用法自行google