各种排序
代码
// sort_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define M 5
#define N 10
#include <cstdio>
#include <iostream>
using namespace std;
//直接插入排序
//直接插入排序的时间复杂度为:O(n^2)
//若待排记录为“正序”时,时间复杂度可提高至:O(n)
void InsertSort_fun(int a[M])
{
int i,j,key;
for(i=1;i<M;i++)
if(a[i]<a[i-1])
{
key=a[i];
a[i]=a[i-1];
//j=i-2;
//cout << "j:"<< j <<" a[j-2]"<< a[j] << endl;
for(j=i-2;j>=0&&key<a[j];--j)//因为没有设哨兵,所以增加了一个条件j>=0
{
//cout << j << endl;
a[j+1]=a[j];
}
a[j+1]=key;
}
}
void InsertSort_test()
{
printf("InsertSort test:\n");
int i,a[5]={5,4,3,2,1};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
InsertSort_fun(a);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
//折半插入排序
//折半插入相对直接插入减少了关键字的比较次数:O(nlogn)
//但移动次数不变,时间复杂度仍为:O(n^2)
void BInsertSort_fun(int a[M])
{
int i,key,low,high,mid,j;
for (i=1;i<M;i++)
{
key=a[i];
a[i]=a[i-1];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(key<a[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>high-1;j--)
a[j+1]=a[j];
a[high+1]=key;
}
}
void BInsertSort_test()
{
printf("Bin InsertSort test:\n");
int i,a[5]={1,3,2,5,4};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
BInsertSort_fun(a);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
void ShellInsert(int a[N],int dk)
{
int i,key,j;
for(i=dk;i<N;i++)
{
if(a[i]<a[i-dk])
{
key=a[i];
//a[i]=a[i-dk];
for(j=i-dk;(j>=0)&&(key<a[j]);j-=dk)
a[j+dk]=a[j];
a[j+dk]=key;
}
}
}
//希尔排序
//注意使增量序列dlta[]中的值没有除1之外的公因子,并且最后一个增量值必须等于1
void ShellSort_fun(int a[N],int dlta[],int t)
{
int k;
for(k=0;k<t;++k)
ShellInsert(a,dlta[k]);
}
void ShellSort_test()
{
int dlta[3]={3,2,1};
cout << " Shell sort test :" << endl;
int i;
int a[N]={2,1,5,3,6,8,7,10,9,4};
cout << "befor sort:" << endl;
for (i=0;i<N;i++)
cout << a[i] << "," ;
cout << endl;
ShellSort_fun(a,dlta,3);
cout << "after sort " << endl;
for(i=0;i<N;i++)
cout << a[i] << "," ;
cout <<endl;
}
//冒泡排序
//时间复杂度:O(n^2)
//空间复杂度:1
//稳定性:稳定
void bubble_sort_fun(int a[],int n)
{
int i,j,tmp,change=1;
for(i=n-1;i>=1&&change;i--)
for(j=0;j<i;j++)
{
change=0;
if(a[j]>a[j+1])
{
change=1;
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
void bubble_sort_test()
{
printf("Bubble Sort test:\n");
int i,a[5]={1,3,2,5,4};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
bubble_sort_fun(a,M);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
void exchange(int & a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
//快速排序
//在所有同数量级O(nlogn)的排序方法中,其平均性能最好
//但若初始记录关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n^2)
//快速排序需要一个栈空间来实现递归,栈的最大深度为[log2n]+1,最坏情况深度为n
//前提:必须是顺序存储
//稳定性:不稳定
int partition(int a[M],int low,int high)
{
//交换顺序表a中子表a[low...high]的记录,使枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大(小)于它
int pivotkey;
pivotkey=a[low];
while(low<high)
{
while(low<high&&a[high]>=pivotkey)
--high;
exchange(a[low],a[high]);
while(low<high&&a[low]<=pivotkey)
++low;
exchange(a[low],a[high]);
}
return low;
}
void QSort(int a[],int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=partition(a,low,high);
QSort(a,low,pivotloc-1);
QSort(a,pivotloc+1,high);
}
}
void quick_sort_test()
{
printf("Quick Sort test:\n");
int i,a[M]={1,3,2,5,4};
for(i=0;i<M;i++)
printf("%d,",a[i]);
cout << endl;
QSort(a,0,M-1);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
int SelectMinkey(int a[],int i,int n)
{
int j,min=a[i],m=i;
for(j=i+1;j<n;j++)
{
if(a[j]<min)
{
min=a[j];
m=j;
}
}
return m;
}
//简单选择排序
//无论记录的初始排列如何,所需进行的关键字间的比较次数相同,均为n(n-1)/2
//空间复杂度:1
void select_sort_fun(int a[],int n)
{
int i,j;
for(i=0;i<n;++i)
{
j=SelectMinkey(a,i,n);
if(i!=j)
exchange(a[i],a[j]);
}
}
void select_sort_test()
{
printf("Select Sort test:\n");
int i,a[M]={1,3,2,5,4};
for(i=0;i<M;i++)
printf("%d,",a[i]);
cout << endl;
select_sort_fun(a,M);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
int _tmain(int argc, _TCHAR* argv[])
{
//
//InsertSort_test();
//
//BInsertSort_test();
//
//ShellSort_test();
//
//bubble_sort_test();
//
//quick_sort_test();
//
select_sort_test();
while(1);
return 0;
}
//
#include "stdafx.h"
#define M 5
#define N 10
#include <cstdio>
#include <iostream>
using namespace std;
//直接插入排序
//直接插入排序的时间复杂度为:O(n^2)
//若待排记录为“正序”时,时间复杂度可提高至:O(n)
void InsertSort_fun(int a[M])
{
int i,j,key;
for(i=1;i<M;i++)
if(a[i]<a[i-1])
{
key=a[i];
a[i]=a[i-1];
//j=i-2;
//cout << "j:"<< j <<" a[j-2]"<< a[j] << endl;
for(j=i-2;j>=0&&key<a[j];--j)//因为没有设哨兵,所以增加了一个条件j>=0
{
//cout << j << endl;
a[j+1]=a[j];
}
a[j+1]=key;
}
}
void InsertSort_test()
{
printf("InsertSort test:\n");
int i,a[5]={5,4,3,2,1};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
InsertSort_fun(a);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
//折半插入排序
//折半插入相对直接插入减少了关键字的比较次数:O(nlogn)
//但移动次数不变,时间复杂度仍为:O(n^2)
void BInsertSort_fun(int a[M])
{
int i,key,low,high,mid,j;
for (i=1;i<M;i++)
{
key=a[i];
a[i]=a[i-1];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(key<a[mid])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>high-1;j--)
a[j+1]=a[j];
a[high+1]=key;
}
}
void BInsertSort_test()
{
printf("Bin InsertSort test:\n");
int i,a[5]={1,3,2,5,4};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
BInsertSort_fun(a);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
void ShellInsert(int a[N],int dk)
{
int i,key,j;
for(i=dk;i<N;i++)
{
if(a[i]<a[i-dk])
{
key=a[i];
//a[i]=a[i-dk];
for(j=i-dk;(j>=0)&&(key<a[j]);j-=dk)
a[j+dk]=a[j];
a[j+dk]=key;
}
}
}
//希尔排序
//注意使增量序列dlta[]中的值没有除1之外的公因子,并且最后一个增量值必须等于1
void ShellSort_fun(int a[N],int dlta[],int t)
{
int k;
for(k=0;k<t;++k)
ShellInsert(a,dlta[k]);
}
void ShellSort_test()
{
int dlta[3]={3,2,1};
cout << " Shell sort test :" << endl;
int i;
int a[N]={2,1,5,3,6,8,7,10,9,4};
cout << "befor sort:" << endl;
for (i=0;i<N;i++)
cout << a[i] << "," ;
cout << endl;
ShellSort_fun(a,dlta,3);
cout << "after sort " << endl;
for(i=0;i<N;i++)
cout << a[i] << "," ;
cout <<endl;
}
//冒泡排序
//时间复杂度:O(n^2)
//空间复杂度:1
//稳定性:稳定
void bubble_sort_fun(int a[],int n)
{
int i,j,tmp,change=1;
for(i=n-1;i>=1&&change;i--)
for(j=0;j<i;j++)
{
change=0;
if(a[j]>a[j+1])
{
change=1;
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
void bubble_sort_test()
{
printf("Bubble Sort test:\n");
int i,a[5]={1,3,2,5,4};
for(i=0;i<5;i++)
printf("%d,",a[i]);
cout << endl;
bubble_sort_fun(a,M);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
void exchange(int & a,int &b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
//快速排序
//在所有同数量级O(nlogn)的排序方法中,其平均性能最好
//但若初始记录关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n^2)
//快速排序需要一个栈空间来实现递归,栈的最大深度为[log2n]+1,最坏情况深度为n
//前提:必须是顺序存储
//稳定性:不稳定
int partition(int a[M],int low,int high)
{
//交换顺序表a中子表a[low...high]的记录,使枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大(小)于它
int pivotkey;
pivotkey=a[low];
while(low<high)
{
while(low<high&&a[high]>=pivotkey)
--high;
exchange(a[low],a[high]);
while(low<high&&a[low]<=pivotkey)
++low;
exchange(a[low],a[high]);
}
return low;
}
void QSort(int a[],int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=partition(a,low,high);
QSort(a,low,pivotloc-1);
QSort(a,pivotloc+1,high);
}
}
void quick_sort_test()
{
printf("Quick Sort test:\n");
int i,a[M]={1,3,2,5,4};
for(i=0;i<M;i++)
printf("%d,",a[i]);
cout << endl;
QSort(a,0,M-1);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
int SelectMinkey(int a[],int i,int n)
{
int j,min=a[i],m=i;
for(j=i+1;j<n;j++)
{
if(a[j]<min)
{
min=a[j];
m=j;
}
}
return m;
}
//简单选择排序
//无论记录的初始排列如何,所需进行的关键字间的比较次数相同,均为n(n-1)/2
//空间复杂度:1
void select_sort_fun(int a[],int n)
{
int i,j;
for(i=0;i<n;++i)
{
j=SelectMinkey(a,i,n);
if(i!=j)
exchange(a[i],a[j]);
}
}
void select_sort_test()
{
printf("Select Sort test:\n");
int i,a[M]={1,3,2,5,4};
for(i=0;i<M;i++)
printf("%d,",a[i]);
cout << endl;
select_sort_fun(a,M);
printf("after sort:\n");
for(i=0;i<5;i++)
printf("%d,",a[i]);
}
int _tmain(int argc, _TCHAR* argv[])
{
//
//InsertSort_test();
//
//BInsertSort_test();
//
//ShellSort_test();
//
//bubble_sort_test();
//
//quick_sort_test();
//
select_sort_test();
while(1);
return 0;
}