printf("%5d",a);
printf("\n");
}
main()
{/*为了公平,我们给每个函数定义一个相同数组*/
inta1[]={13,0,5,8,1,7,21,50,9,2};
inta2[]={13,0,5,8,1,7,21,50,9,2};
inta3[]={13,0,5,8,1,7,21,50,9,2};
inta4[]={13,0,5,8,1,7,21,50,9,2};
inta5[]={13,0,5,8,1,7,21,50,9,2};
printf("theoriginallist:
");
print(a1,10);
printf("accordingtobubble:
");
bubble(a1,10);
print(a1,10);
printf("accordingtochoise:
");
choise(a2,10);
print(a2,10);
printf("accordingtoquick:
");
quick(a3,
0,9);
print(a3,10);
printf("accordingtoinsert:
");
insert(a4,10);
print(a4,10);
printf("accordingtoshell:
");
shell(a5,10);
print(a5,10);
}
6)希尔排序
算法思想简单描述:
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,
并且对插入下一个数没有提供任何帮助。
如果比较相隔较远距离(称为
增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除
多个元素交换。
D.L.shell于1959年在以他名字命名的排序算法中实现
了这一思想。
算法先将要排序的一组数按某个增量d分成若干组,每组中
记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量
对它进行,在每组中再进行排序。
当增量减到1时,整个要排序的数被分成
一组,排序完成。
C/C++code
voidshell_sort(int*x,intn)
{
inth,j,k,t;
for(h=n/2;h>0;h=h/2)/*控制增量*/
{
for(j=h;j{
t=*(x+j);
for(k=j-h;(k>=0&&t<*(x+k));k-=h)
{
*(x+k+h)=*(x+k);
}
*(x+k+h)=t;
}
}
}
几种排序算法的比较和选择
1.选取排序方法需要考虑的因素:
(1)待排序的元素数目n;
(2)元素本身信息量的大小;
(3)关键字的结构及其分布情况;
(4)语言工具的条件,辅助空间的大小等。
小结:
(1)若n较小(n<=50),则可以采用直接插入排序或直接选择排序。
由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。
(2)若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:
快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序法中被认为是最好的方法。
(4)在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:
当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。
(5)当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。
//堆排序(从下标为1的位置开始)
voidheap_adjust(int*p,introot,intlen)
{
inti=2*root;
intfinish=0;
intt=p[root];
while(i<=len&&finish==0)
{
if(i{
if(p[i]
i++;
}
if(t>=p[i])
{
finish=1;
}
else
{
p[i/2]=p[i];
i=2*i;
}
}
p[i/2]=t;
}
voidheapSort(int*p,intlen)
{
inti;
for(i=len/2;i>0;i--)
{
heap_adjust(p,i,len);
}
for(i=len;i>=1;i--)
{
p[0]=p[1];
p[1]=p[i];
p[i]=p[0];
heap_adjust(p,1,i-1);
}
}
//基数排序
inttemp_digit(inttemp,intflag)
{
inti;
i=temp/(int)pow(10,flag)%10;
returni;
}
voidbaseSort(int*p,intlen)
{
inti,j,k,index,temp;
intcount[10];
intarray[10][20]={0};
for(i=0;i<3;i++)
{
for(j=0;j<10;j++)
{
count[j]=0;
}
for(j=0;j{
temp=temp_digit(p[j],i);
array[temp][count[temp]++]=p[j];
}
index=0;
for(j=0;j{
for(k=0;k{
p[index]=array[j][k];
index++;
}
}
}
}
排序演示:
插入排序演示过程:
直接选择排序演示过程:
:
冒泡排序演示过程:
:
快速排序演示过程:
:
堆排序演示过程:
:
基数排序演示过程:
:
桶排序演示过程:
:
归并排序演示过程:
:
#include
#include
#include
#include
//创建数组
voidmakeArray(int*p,intlen)
{
inti;
srand((unsigned)time(NULL));
for(i=0;i{
p[i]=rand()%100+1;
}
}
//交换两个数
voidmySwap(int*p1,int*p2)
{
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
//输入
voidoutPut(int*p,intlen)
{
inti;
for(i=0;i{
printf("%d,",p[i]);
}
puts("");
}
//插入排序
voidinsertSort(int*p,intlen)
{
inti=0,j=0;
inttemp;
for(i=1;i{
j=i;
temp=p[i];
while(j>0&&temp
{
p[j]=p[j-1];
j--;
}
p[j]=temp;
}
}
//选择排序
voidselectSort(int*p,intlen)
{
inti,j,k;
for(i=0;i{
k=i;
for(j=i+1;j{
if(p[k]>p[j])k=j;
}
if(k!
=i)
{
mySwap(&p[i],&p[k]);
}
}
}
//冒泡排序
voidbubbleSort(int*p,intlen)
{
inti,j;
for(i=0;i{
for(j=0;j{
if(p[j]>p[j+1])
{
mySwap(&p[j],&p[j+1]);
}
}
}
}
//希尔排序
voidshellSort(int*p,intlen)
{
inti,j,now,temp;
for(now=len/2;now>=1;now/=2)
{
for(i=now;i{
temp=p[i];
j=i;
while(j>=now&&temp
{
p[j]=p[j-now];
j-=now;
}
p[j]=temp;
}
}
}
//快速排序
voidquickSort(int*p,intbegin,intend)
{
inti=begin;
intj=end;
inttemp=p[i];
while(i{
while(itemp)j--;
if(i{
p[i]=p[j];i++;
}
while(iif(i{
p[j]=p[i];j--;
}
}
p[i]=temp;
if(begin{
quickSort(p,begin,i-1);
}
if(j+1{
quickSort(p,j+1,end);
}
}
//堆排序(从下标为1的位置开始)
voidheap_adjust(int*p,introot,intlen)
{
inti=2*root;
intt=p[root];
while(i<=len)
{
if(i{
if(p[i]
}
if(t>=p[i])break;
p[i/2]=p[i];
i=2*i;
}
p[i/2]=t;
}
voidheapSort(int*p,intlen)
{
inti;
for(i=len/2;i>0;i--)
{
heap_adjust(p,i,len);
}
for(i=len;i>=1;i--)
{
mySwap(p+i,p+1);
heap_adjust(p,1,i-1);
}
}
//基数排序
inttemp_digit(inttemp,intflag)
{
inti;
i=temp/(int)pow(10,flag)%10;
returni;
}
voidbaseSort(int*p,intlen)
{
inti,j,k,index,temp;
intcount[10];
intarray[10][20]={0};
for(i=0;i<3;i++)
{
for(j=0;j<10;j++)
{
count[j]=0;
}
for(j=0;j{
temp=temp_digit(p[j],i);
array[temp][count[temp]++]=p[j];
}
index=0;
for(j=0;j{
for(k=0;k{
p[index]=array[j][k];
index++;
}
}
}
}
voidmain()
{
intnum[10];
intlen=sizeof(num)/sizeof(int);
makeArray(num,len);
outPut(num,len);
//insertSort(num,len);
//selectSort(num,len);
//bubbleSort(num,len);
//shellSort(num,len);
//quickSort(num,0,len-1);
//heapSort(num,len);
baseSort(num,len);
outPut(num,len);
}