三种sort方法及比较

来源:互联网 发布:数据置乱 编辑:程序博客网 时间:2024/06/06 04:52

在三种排序中,理论上复杂度为O(N*logN)

在实现过程中,heapsort也许因为代码的原因,较其他两种慢很多疑问

 

 

heapsort:

 

 

#include<iostream>
#include <time.h>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
int a[10001];
int length=10;

void max_heapify(int a[],int i)
{
 int l,r,largest,t;
 l=2*(i+1)-1;
 r=2*(i+1);
 if(l<=length&&a[l]>a[i])
  largest=l;
 else
  largest=i;
 if(r<=length&&a[r]>a[largest])
  largest=r;

 if(largest!=i)
 {
  t=a[i];
  a[i]=a[largest];
  a[largest]=t;
 }
 
}
void build_max_heap(int a[])
{
 int i;
 for(i=length/2-1;i>=0;i--)
 {
  max_heapify(a,i);
 }
}
void heapsort(int a[])
{
 int i,t;
 build_max_heap(a);
 for(i=length;i>=1;i--)
 {
  t=a[0];
  a[0]=a[i];
  a[i]=t;
  
  length--;
  build_max_heap(a);
 }
}
void heap_insert(int a[],int i,int key)//还不能实现
{
 if(key<a[i])
  cout<<"Error"<<endl;
 else
 {
  a[i]=key;
  
 }
 heapsort(a);
}
 

int main()
{
 
 

   
 int i,b;
 clock_t start = clock();


    srand((unsigned)time(NULL));

  for(i=0;i<=10;i++)
      a[i]=rand()%10000+1;
  i=0;
  heapsort(a);
  clock_t end = clock();

  for(i=0;i<=10;i++)
   cout<<a[i]<<" ";
  cout<<endl;

  printf("\nHeapsort Total time used: %.1f ms:\n",(double)(end - start));


 return 0;
}

 

 

mergesort :

#include<iostream>
#include <time.h>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
#define max 99999999
int l[5001];
int m[5001];
int a[10001];
void merge(int a[],int p,int q,int r)
{
 int n1,n2,i,j,k;
 n1=q-p+1;
 n2=r-q;
 for(i=0;i<n1;i++)
  l[i]=a[p+i];
 for(j=0;j<n2;j++)
  m[j]=a[q+1+j];
 l[n1]=max;
 m[n2]=max;
 i=0;j=0;
 for(k=p;k<=r;k++)
 {
  if(l[i]<=m[j])
  {
   a[k]=l[i];
   i++;
  }
  else
  {
   a[k]=m[j];
   j++;
  }
 }
}
void mergesort(int a[],int p,int r)
{
 int q;
 if(p<r)
 {
 q=(p+r)/2;
 mergesort(a,p,q);
 mergesort(a,q+1,r);
 merge(a,p,q,r);
 }
}
 
int main()
{
 int i,b;
 clock_t start = clock();


    srand((unsigned)time(NULL));

  for(i=0;i<=10;i++)
      a[i]=rand()%10000+1;
  i=0;
  mergesort(a,0,10);
  clock_t end = clock();

  for(i=0;i<=10;i++)
   cout<<a[i]<<" ";
  cout<<endl;

  printf("\nMergesort Total time used: %.1f ms:\n",(double)(end - start));

  return 0;
}

 

quicksort:

 

#include<iostream>
#include <time.h>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
int a[10001];
int partition(int a[],int p,int r)
{
 
 int x,i;
 x=a[r];
 i=p-1;
 int j,t;
 for(j=p;j<r;j++)
 {
  if(a[j]<=x)
  {
   i=i+1;
   t=a[i];
   a[i]=a[j];
   a[j]=t;
  }
 }
 t=a[i+1];
 a[i+1]=a[r];
 a[r]=t;
 return i+1;
}

void quicksort(int a[],int p,int r)
{
 int q;
 if(p<r)
 {
  q=partition(a,p,r);
  quicksort(a,p,q-1);
  quicksort(a,q+1,r);
 }
}

 

int main()
{
 int i,b;
 clock_t start = clock();


    srand((unsigned)time(NULL));

  for(i=0;i<=10;i++)
      a[i]=rand()%10000+1;
  i=0;
  quicksort(a,0,10);
  clock_t end = clock();

  for(i=0;i<=10;i++)
   cout<<a[i]<<" ";
  cout<<endl;

  printf("\nQuicksort Total time used: %.1f ms:\n",(double)(end - start));

}

 

//partition的复杂度为n;sort的复杂度最差为n^2,期望复杂度为n*logN;

 

 

0 0
原创粉丝点击