几种排序算法
来源:互联网 发布:vb label 编辑:程序博客网 时间:2024/05/01 16:45
原来在做数据结构课程设计的时候,分别对几种排序算法的“关键字的比较次数”、“记录的移动次数”做了具体的比较,结果显示在一般情况下快速排序最好、堆排序次之。
表 几种常用排序算法性能比较
时间复杂度
空间复杂度
稳定
1
插入排序
O(n2)
1
√
2
希尔排序
O(n2)
1
×
3
冒泡排序
O(n2)
1
√
4
选择排序
O(n2)
1
×
5
快速排序
O(Nlogn)
O(logn)
×
6
堆排序
O(Nlogn)
1
×
7
归并排序
O(Nlogn)
O(n)
√
在一些排序算法中要求较快的速度,因而要选择好的排序算法。
归并排序
快速排序
堆排序
插入排序
冒泡排序
希尔排序
选择排序
下面给出几种排序算法的实现及调用,数组采用0下标开始,size为n:
堆排序:
void swap(int x[],int i,int j)
{int t = x[i];
x[i] = x[j];
x[j] = t;
}
void restore(int a[],int root,int n)
{
int m,j = root;
while(j <= n/2 - 1)
{
if((j*2+2 < n)&&(a[j*2+1] < a[j*2+2]))
m = j*2+2;
else
m = j*2+1;
if(a[j] < a[m])
{
swap(a,j,m);
j = m;
}
else
return;
}
}
//堆排序,即使不断的重建
void heapsort(int a[],int n)
{
int i;
for(i = n/2 - 1;i >= 0;i --)
restore(a,i,n);
for(i = n-1;i > 0;i --)
{
swap(a,0,i);
restore(a,0,i);
}
}
//调用方式:heapsort(start,n);
快速排序:
递归算法(摘自编程之美,精简清晰):
void quicksort(int x[],int l,int u)
{
int i,m;
if(l >= u)return;
m = l;
for(i = l+1; i <= u;i ++)
if(x[i] < x[l])
swap(x,++m,i);
swap(x,l,m);
quicksort(x,l,m-1);
quicksort(x,m+1,u);
}
调用方式:quicksort(start,0,n-1);
---------------------------------------------------------------------------------------------
以下内容来自本科的课程设计代码,数组下标从1-n,代码不是很清晰,仅供参考。
//**************************直接插入排序*************************
void InsertSort(int a[],int n)
{
int t,j;
for(int i=2;i<=n;i++)
{
t=a[i];
j=i-1;
while(t<a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=t;
}
}
//*****************************************************************
//**************************快速排序算法******************//
int Part(int a[],int m,int n)
{
int i,j,k;
Interchange(a,(int)(m+n)/2,m+1);
if(a[m+1]>a[n])
Interchange(a,m+1,n);
if(a[m]>a[n])
Interchange(a,m,n);
if(a[m+1]>a[m])
Interchange(a,m,m+1);
i=m;
j=n+1;
k=a[m];
while(i<j)
{
i++;
while(a[i]<k)
i++;
j--;
while(a[j]>k)
j--;
if(i<j)
Interchange(a,i,j);
}
Interchange(a,m,j);
return j;
}
class stacktype
{
public:
int x,y;
stacktype(int m=0,int n=0):x(m),y(n){}
};
void HSort(int a[],int n,int M)
{
stack<stacktype> stackptr;
stacktype temp(0,0);
int f,t,j;
stackptr.push(temp);
f=1;
t=n;
while(f<t)
{
j=Part(a,f,t);
if((j-f<M)&&(t-j<M))
{
if(!stackptr.stackEmpty()){
temp=stackptr.pop();
f=temp.x;
t=temp.y;
continue;
}
else
break;
}
if((j-f<M)&&(t-j>=M))
{
f=j+1;
continue;
}
if((j-f>=M)&&(t-j<M))
{
t=j-1;
continue;
}
if((j-f>=M)&&(t-j>=M))
{
if(j-f>t-j)
{
stackptr.push(stacktype(f,j-1));
f=j+1;
}
else
{
stackptr.push(stacktype(j+1,t));
t=j-1;
}
}
}
InsertSort(a,n);
}
//******************************over***************************//
void main()
{
int a[11]={-1,1,2,5,7,3,9,4,8,6,0};
for(int i=1;i<=10;i++)
cout<<a[i]<<" ";
cout<<endl;
HSort(a,10,4);
for(i=1;i<=10;i++)
cout<<a[i]<<" ";
cout<<endl;
}
直接选择排序:
//排序调试程序之直接选择排序
#include "iostream.h"
//交换数组中下标为m/n的数
void Interchange(int a[],int m,int n)
{
int t;
t=a[m];
a[m]=a[n];
a[n]=t;
}
//直接选择排序算法
void SSort(int a[],int n)
{
int t;
for(int j=n;j>=2;j--)
{
t=1;
for(int i=2;i<=j;i++)
if(a[t]<a[i])
t=i;
Interchange(a,j,t);
}
}
void main()
{
int a[11]={-1,1,2,5,7,3,9,4,8,6,0};
for(int i=1;i<=10;i++)
cout<<a[i]<<" ";
cout<<endl;
SSort(a,10);
for(i=1;i<=10;i++)
cout<<a[i]<<" ";
cout<<endl;
}
冒泡排序和直接插入排序略