延续上一篇博客,上一篇讲了排序算法O(n2)的算法和优化,还有针对什么情况下的数据什么排序更有效的问题的详解,今天来谈谈看O(nlogn)的排序的实现和优化,以及对应的数据情况分析。
第一:归并排序:
归并排序的算法思路就是:分而治之,先划分成小数组,然后再两两合并,最后合并成一个最终的数组。
下面个代码实现:
void megre(int a[],int first,int mid,int last,int temp[]){
int i=first,j=mid+1;
int k=0;
while(i<=mid&&j<=last){
if(a[i]=last)
return ;
int mid=first+(last-first)/2;
megresort(a,first,mid,temp);
megresort(a,mid+1,last,temp);
megre(a,first,mid,last,temp);
}
这里我做了一个小优化, 在排序之前,我先构建了一个与之前一样大的数组,这样避免了在megre的过程中频繁的构造和销毁临时数组所带来的消耗。
第二:快速排序
快排的原理就是,找一个数,比他小的放左边,比他大的放右边。然后在他左边的数据里面找一个数,递归上过程。
这里我写了一个基础快排和三路快排,基于普通的数据,三路快排和基础快排皆可,对于有大量的重复数据,用三路快排明显优于基础快排,下面给出代码实现:
int partition(int a[],int first,int last){
int value=a[first];
int j=first;
for(int i=first+1,i<=last;i++){
if(a[i]<=value)
swap(a[j++],a[i]);
}
swap(a[j],a[first]);
return j;
}
void quicksort(int a[],int first,int last){
if(first>=last){
return;
p=partition(a,first,last);
quicksort(a,first,p-1);
quicksort(a,p+1,last);
}
void quick3waysort(int a[],int n){
srand(time(NULL));
_quick3waysort(a,0,n-1);
}
void _quick3waysort(int a[],int left,int right){
if(left>=right)
return ;
partation(a,left,right);
}
void partation(int a[],int left,int right){
if(left>=right)
return ;
swap(a[left],a[rand()%(right-left+1)+1]);
int value=a[left];
int j=left;
int move=right+1;
int i=left+1;
while(ivalue){
swap(a[i],a[move-1]);
move--;
}
else(a[i]
第三:堆排序:
堆排序最重要的就是构建一个大根堆或者是一个小根堆,而对于大根堆的构建,插入,删除,我放下一篇博客里面写。