各种排序的深入和对不同数据的处理的性能分析(二)

延续上一篇博客,上一篇讲了排序算法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]

第三:堆排序:

堆排序最重要的就是构建一个大根堆或者是一个小根堆,而对于大根堆的构建,插入,删除,我放下一篇博客里面写。

 

 

 

 

 

你可能感兴趣的:(算法,数据结构与leetcode)