现在的位置: 首页 > 综合 > 正文

排序

2014年01月31日 ⁄ 综合 ⁄ 共 5567字 ⁄ 字号 评论关闭
一个测试排序时间的程序
#include<iostream> 
#include<iomanip> 
using namespace std; 
void Sort(int a[], int n);
int main()
{
  const int N=100000;
  int a[N], i;
  srand(time(0));
  for(i=0; i<N; i++) a[i] = rand() % 1000;
  clock_t t0 = clock();
  SelectSort(a, N);  
  clock_t t = clock();
//  for(i=0; i<N; i++) cout << setw(5) << a[i];
  cout<<"用时:"<<t-t0<<"ms"<<endl;
  return 0;
}

//一、插入排序
//1、直接插入排序。
void InsertSort(int a[], int n)
{
  int i,j,temp;
  for(i=1; i<n; i++)
  { 
    temp = a[i];
    j = i-1;
    while(j>=0 && a[j]>temp)
    { a[j+1] = a[j]; j--; }
    a[j+1] = temp;
  }
}

//2、改进的插入排序(加上哨兵)
void InsertSort2(int a[], int n)
{
  int i,j;
  for (i=2; i<n; i++)
  {
    a[0] = a[i];
    j = i-1;
    while(a[j]>a[0]) { a[j+1] = a[j]; j--; }
    a[j+1] = a[0];
  }
}

//3、折半插入排序
void BinaryInsertSort(int a[], int n)
{
  for (int i = 1; i < n; i++)
  {
    int temp = a[i];
    int low = 0, high = i - 1;
    while (low <= high)
    {
      int mid = (low + high) / 2;
      if (temp < a[mid]) high = mid - 1;
      else low = mid + 1;
    }
    for (int j = i-1; j >= low; j--) { a[j+1] = a[j]; }
    a[low] = temp;
  }
}
  
//4、希尔排序(缩小增量排序)
void ShellSort(int a[], int n)
{
  int d = n/2;
  while(d >= 1)
  {
    for(int i=d; i<n; i++)
    {
      int temp = a[i];
      int j = i-d;
      while(j>=0 && a[j]>temp)
       { a[j+d] = a[j]; j = j-d; }
      a[j+d] = temp;
    }
    d = d/2;
  }
}

-----
//5.插入排序
#include<iostream.h>
void isort(int*a,int size);

int main()
{
	int array[]={55,2,6,4,32,12,9,73,26,37};

	int len=sizeof(array)/sizeof(int);   //元素个数
	for(int i=0;i<size;i++)        //原始顺序输出
		cout<<a[i]<<",";
	cout<<endl<<endl;
	isort(array,len);    //调用排序函数
}

isort(int a[],int size)           //插入排序
{
	int inserter,index;
	for(int i=1;i<size;i++)               //共执行 size-1 轮
	{
		inserter=a[i];
		index=i-1;
		while(index>=0&&inserter<a[index])     //寻找插入点
		{
			a[index+1]=a[index];       //后挪一个位置
			index--;
		}
		a[index+1]=inserter;     //插入
		for(int j=0;j<size;j++)    //比较一轮后就输出
		{
			cout<<a[j]<<",";
			if(j==i)         //已排序与为排序的分界线
				cout<<'|';
		}
		cout<<endl;
	}
}

//6.插入排序

template<class T>        //插入
void Insert(const T&e,T*a,int i)
{
	a[0]=e;
	while(e<a[i])
	{
		a[i+1]=a[i];
		i--;
	}
	a[i+1]=e;
}
template<class T>        //排序
void TnsertionSort(T*a,const int n)
{
	for(int j=2;j<=n;j++)
	{
		T temp=a[j];
		Insert(temp,a,j-1);
	}
}

//二、选择排序
//1、直接选择排序。
void SelectSort(int a[], int n)
{
  int i,j,k,m;
  for(i=0; i<n-1; i++)
  { m = a[i];
    k = i;
    for(j=i+1; j<n; j++)
      if(a[j] < m) 
        { m = a[j]; k = j; }
    a[k] = a[i];
    a[i] = m;
  }
}

//3、堆排序
void HeapAjust(int a[], int s, int m) 
{ //把数组a从s到m进行调整
  int j = 2*s+1; 
  int x = a[s];  
  while( j <= m ) 
  { if( (j+1<=m) && (a[j+1] > a[j]) ) j++; 
    if( x >= a[j] ) break; 
    else 
    { a[s] = a[j]; 
      s = j; 
      j = 2*s + 1; 
    } 
  } 
  a[s] = x; 
} 

void HeapSort(int a[], int n)
{
  for(int i=(n-2)/2; i>=0; i--) HeapAjust(a,i,n-1);
  for(int i=n-1; i>0; i--) 
  { int t = a[0]; a[0] = a[i]; a[i] = t;
    HeapAjust(a,0,i-1);
  }
}

//三、交换排序(从前往后)。
//1、冒泡排序。
void bubble(int a[], int n)
{ int i,j,t;
  for(i=1; i<n; i++)  //此行可写为 for(i=n-1; i>0; i--)
  {
    for(j=0; j<n-i; j++)  //对应上面的改动,此行要改为 for(j=0; j<n; j++)
      if( a[j]>a[j+1] )
      { t = a[j]; 
        a[j] = a[j+1]; 
        a[j+1] = t; 
      }
  }
} 

//2、冒泡排序(从后往前)。
void bubble2(int a[], int n)
{ int i,j,t;
  for(i=0; i<n-1; i++)
  {
    for(j=n-1; j>i; j--)
      if( a[j-1]>a[j] )
      { t = a[j-1]; 
        a[j-1] = a[j]; 
        a[j] = t; 
      }
  }
} 

//3、改进的冒泡排序(加上一标志flag)。
void bubble3(int a[], int n)
{ int i, flag=1, t;
  for(i=1; i<n && flag==1; i++)
  { flag = 0;
    for(int j=0; j<n-i; j++)
      if( a[j]>a[j+1] )
      { t = a[j]; 
        a[j] = a[j+1]; 
        a[j+1] = t; 
        flag = 1;
      }
  }
} 

//4、改进的冒泡排序()。
void bubble4(int a[], int n)
{ int k=1, m=n-1;
  while(k!=0)
  { k = 0;
    for(int j=0; j<m; j++)
      if( a[j]>a[j+1] )
      { int t = a[j]; 
        a[j] = a[j+1]; 
        a[j+1] = t; 
        k = j;
      }
    m = k;
  }
} 

//5、改进的冒泡排序(双向起泡、摇动排序)。
void ShakeSort(int a[], int n)
{
  int j, k=0, low=0, high=n-1, t;
  while(low < high)
  {
    for(j=low; j<h; j++)  
      if( a[j]>a[j+1] )
      { t = a[j]; a[j] = a[j+1]; a[j+1] = t; k=j; }
    high = k;
    for(j=h; j>l; j--)  
      if( a[j-1]>a[j] )
      { t = a[j-1]; a[j-1] = a[j]; a[j] = t; k=j; }
    low = k;
  }
}

//6、希尔排序(缩小增量排序)
void ShellSort2(int a[], int n)
{
  int d = n/2;
  bool flag;
  while(d >= 1)
  {
    do
    { flag = false;
      for(int i=0; i<n-d; i++)
      {
        int j = i+d;
        if(a[i]>a[j])
        { int t = a[i]; a[i] = a[j]; a[j] = t; 
          flag = 1;
        }
      }
    }while(flag);
    d = d/2;
  }
}

//7、快速排序
int Partition(int a[], int low, int high)
{
  int x=a[low];
  while(low < high)
  {
    while(low<high && a[high]>=x) high--;
    if(low<high)
      { a[low] = a[high]; low++; }
    while(low<high && a[low]<=x) low++;
    if(low<high) 
      { a[high] = a[low]; high--; }
  }
  a[low] = x;
  return low;
}

void QSort(int a[], int low, int high)
{
  if(low<high)
  {
    int mid = Partition(a,low,high);
    QSort(a, low, mid-1);
    QSort(a, mid+1, high);
  }
}

void QuickSort(int a[], int n)
{
  QSort(a, 0, n-1);
}

//8、快速排序(另一分区算法)
int Partition2(int a[], int low, int high)
{
  int i=low, j=high+1, x=a[low], t;
  while(i < j)
  {
    do i++; while(a[i]<x);
    do j--; while(a[j]>x);
    if(i<j)
    { t=a[i]; a[i]=a[j]; a[j]=t; }
  }
  a[low] = a[j]; a[j] = x;
  return j;
}

//8、快速排序(另一分区算法)
int Partition3(int a[], int low, int high)
{
  int k=low, x=a[low];
  for(i=low+1; i<=high; i++)
    if(a[i]<x)
    { k++; swap(a[k], a[i]); }
  swap(a[low], a[k]);
  return k;
}



//9、归并排序(非递归形式)
void Merge(int a[], int b[], int l, int m, int n)
{ //将a[l]…a[m]和a[m+1]…a[n]合并到b[l]…b[n]
  int i=l, j=m+1, k=l;
  while(i<=m && j<=n)
    if(a[i]<=a[j]) b[k++] = a[i++];
    else b[k++] = a[j++];
  while(i<=m) b[k++] = a[i++];
  while(j<=n) b[k++] = a[j++];
}

void MergePass(int a[], int b[], int n, int len)
{
  int i=0;
  while( i+2*len-1 < n )
  { Merge(a,b,i,i+len-1,i+2*len-1);
    i += 2*len;
  }
  if( i+len < n )
    Merge(a,b,i,i+len-1,n-1);
  else 
    for(int j=i; j<n; j++) b[j] = a[j];
}

void MergeSort(int a[], int n)
{
  int b[n], len=1;
  while(len<n)
  { MergePass(a,b,n,len); len *=2;
    MergePass(b,a,n,len); len *=2;
  }
}


//9、归并排序(递归形式)
void Merge(int a[], int b[], int l, int m, int n)
{ //将a[l]…a[m]和a[m+1]…a[n]合并到b[l]…b[n]
  int i=l, j=m+1, k=l;
  while(i<=m && j<=n)
    if(a[i]<=a[j]) b[k++] = a[i++];
    else b[k++] = a[j++];
  while(i<=m) b[k++] = a[i++];
  while(j<=n) b[k++] = a[j++];
}

void Msort( int a[], int b[], int s, int t )
{ // 将a[s..t]进行2-路归并排序,利用b数组。
  if (s==t) return;
  int m = (s+t)/2; // 将a[s..t]平分为a[s..m]和a[m+1..t]
  Msort(a, b, s, m); 
  Msort(a, b, m+1, t); 
  Merge(a, b, s, m, t); // 将a[s..m]和a[m+1..t]归并到b[s..t]
  for(int i=s; i<=t; i++) a[i] = b[i];
} 
  
void MergeSort(int a[], int n)
{ 
   int b[n];
   Msort(a, b, 0, n-1);
} 


例:比较计数法排序
void ComparisonCountingSort(int a[], int n)
{ 
  int *count = new int[n];
  int *b = new int[n];
  for(int i=0; i<n; i++) count[i]=0;
  for(int i=0; i<n-1; i++)
    for(int j=i+1; j<n; j++)
      if(a[i]>a[j]) count[i]++;
      else count[j]++;
  for(int i=0; i<n; i++) b[count[i]]=a[i];
  for(int i=0; i<n; i++) a[i]=b[i];
}

例:分布排序
void DistributionCountingSort (int a[], int n, int l, int u)
{ //分布计数法排序,对n个值为l~u的数进行排序
  int i, j;
  int *d = new int[u-l+1];
  int *b = new int[n];
  for(j=0; j<=u-l; j++) d[j] = 0;
  for(i=0; i<n; i++) d[a[i]-l]++;
  for(j=1; j<=u-l; j++) d[j] = d[j-1] + d[j];
  for(i=n-1; i>=0; i--)
  { j = a[i] - l; 
    b[d[j]-1] = a[i];
    d[j]--;
  }
  for(int i=0; i<n; i++) a[i] = b[i];
}

 

【上篇】
【下篇】

抱歉!评论已关闭.