sortting algorithms

快速排序

/*******************************************************************************
QuickSort.cpp
Zhuo Wang.
*******************************************************************************/
 
#include <iostream>
#include <fstream>
#include "stdlib.h"
#include <ctime>
 
using namespace std;
 
template <class T>
long Partition(T* data, long* link, long low, long high, bool ascend)
{
  long i,j,k;
  long thresindex;
  bool tmpbool;
  thresindex=link[low];
  i=low;
  j=high;
  while(i<j)
  {
    do {
      i++;
      if(i>high-1) break;
      if(ascend)
        tmpbool=data[link[i]]<data[thresindex];
      else tmpbool=data[link[i]]>data[thresindex];
    } while(tmpbool);
    if(i>high-1) { j=high-1; break; }
 
    do {
      j--;
      if(j<low+1) break;
      if(ascend)
        tmpbool=data[link[j]]>data[thresindex];
      else tmpbool=data[link[j]]<data[thresindex];
    } while(tmpbool);
    if(j<low+1) { j=low; break; }
 
    if(i<j) {
      k=link[i];
      link[i]=link[j];
      link[j]=k;
    }
  }
  link[low]=link[j];
  link[j]=thresindex;
  return j;
}
 
template <class T>
void QuickSort(T* data, long* link, long low, long high, bool ascend)
{
  long mid=0;
  if(low<high)
  {
    mid=high+1;
    mid=Partition(data,link,low,mid,ascend);
    QuickSort(data,link,low,mid-1,ascend);
    QuickSort(data,link,mid+1,high,ascend);
  }
}
 
int main()
{
  long DATANUM=100000;
  long *data;
  long *link;
  long i;
  cout<<"Please input the total number of random-generated digits(default 100000):";
  cin>>DATANUM;
  if(DATANUM<1) DATANUM=100000;
 
  data=(long *)malloc(DATANUM*sizeof(long));
  link=(long *)malloc(DATANUM*sizeof(long));
 
  /* Create random numbers & initial the index in array "link" */
  srand((unsigned)(time(NULL)));
  for(i=0;i<DATANUM;i++)
  {
    data[i]=(rand()*10000+rand())%(DATANUM*2);
    link[i]=i;
  }
  cout<<endl;
 
  /* Sort! Then show how long of the sorting procedure! */
  clock_t start,end;
  double  duration;
  start=clock();
  QuickSort(&data[0],&link[0],0,DATANUM-1,1);
  end=clock();
  duration = (double)(end-start);
  cout<<"Time elapsed = "<<duration<<" ms!\n";
 
  /* Prlong results to screen! */
  ofstream out;
  char b[255];
  cout<<"Please input a filename to save the results:";
  cin>>b;
  out.open(b,ios::out);
  for(i=0;i<DATANUM;i++) {
    cout<<data[link[i]]<<" ";
    out<<data[link[i]]<<endl;
  }
  out.close();
  system("pause");
  return 0;
}