内部排序算法比较c语言课程设计,内部排序算法的比较和实现

/*冒泡排序  插入排序 二路插入排序 希尔排序   快速排序 选择排序 归并排序  堆排序算法的

C/C++实现。

作者:feosun

日期:2008年10月12日

参考资料:数据结构(C语言版) 清华大学出版社*/#includeusingnamespacestd;//交换两个数的值voidswap(int&a,int&b)

{inttmp;

tmp=a;

a=b;

b=tmp;

}//屏幕输出数组voiddisplay(intarray[],intlen)

{

cout<

{

cout<

}

cout<

}/*冒泡排序

算法思想:将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。

根据轻气泡不能在重气泡之下的原则,从下往上扫描数组 R:凡扫描到违反本原则的

轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,

重者在下为止。

时间复杂度 o(n^2)

空间复杂度 o(1)

比较次数 n(n+1)/2*/voidbubble_sort(intarray[],intlen)

{for(inti=len-1;i>=0;i--)

{for(intj=0;jarray[j+1])

swap(array[j],array[j+1]);

}

}/*直接插入排序

算法思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元

素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它

插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

时间复杂度 o(n^2)

空间复杂度 o(1)

比较次数 n(n+1)/2*/voidinsert_sort(intarray[],intlen)

{inttmp,i,j;for(i=1;i

{if(array[i]

{

tmp=array[i];

array[i]=array[i-1];//插入到相应位置for(j=i-2;j>=0;j--)

{//往后移if(array[j]>tmp )

array[j+1]=array[j];else{

array[j+1]=tmp;break;

}

}if(j==-1)

array[j+1]=tmp;

}

}

}/*2-路插入排序

算法思想:增加一个辅助空间d,把r[1]赋值给d[1],并将d[1]看成是排好序后处于中间

位置的记录。然后从r[2]开始依次插入到d[1]之前或之后的有序序列中。

时间复杂度 o(n^2)

空间复杂度 o(1)

比较次数 n(n+1)/2*/voidbi_insert_sort(intarray[],intlen)

{int*arr_d=(int*)malloc(sizeof(int)*len);

arr_d[0]=array[0];inthead=0,tail=0;for(inti=1;i

{if(array[i]>arr_d[0])

{intj;for( j=tail;j>0;j--)

{if(array[i]

arr_d[j+1]=arr_d[j];elsebreak;

}

arr_d[j+1]=array[i];

tail+=1;

}else{if(head==0)

{

arr_d[len-1]=array[i];

head=len-1;

}else{intj;for(j=head;j<=len-1;j++)

{if(array[i]>arr_d[j])

arr_d[j-1]=arr_d[j];elsebreak;

}

arr_d[j-1]=array[i];

head-=1;

}

}

}for(inti=0;i

{intpos=(i+head );if(pos>=len) pos-=len;

array[i]=arr_d[pos];

}

free(arr_d);

}/*希尔排序

算法思想:先将整个待排序记录分割成若干子序列分别进行直接插入排

序,待整个序列中的记录基本有序时,再对全体记录进行一

次直接插入排序

时间复杂度 o(n^2)

空间复杂度 o(1)

比较次数 ?*/voidshell_insert(intarray[],intd,intlen)

{inttmp,j;for(inti=d;i

{if(array[i]

{

tmp=array[i];

j=i-d;do{

array[j+d]=array[j];

j=j-d;

}while(j>=0&&tmp

array[j+d]=tmp;

}

}

}voidshell_sort(intarray[],intlen)

{intinc=len;do{

inc=inc/2;

shell_insert(array,inc,len);

}while(inc>1);

}/*快速排序

算法思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递

归地解这些子问题,然后将这些子问题的解组合成为原问题的解。

时间复杂度 o(nlogn)

空间复杂度 o(logn)

比较次数  ?*/intpartition(intarray[],intlow,inthigh)

{intpivotkey=array[low];while(low

{while(low=pivotkey)--high;

swap(array[low],array[high]);while(low

swap(array[low],array[high]);

}

array[low]=pivotkey;returnlow;

}voidquick_sort(intarray[],intlow,inthigh)

{if(low

{intpivotloc=partition(array,low,high);

quick_sort(array,low,pivotloc-1);

quick_sort(array,pivotloc+1,high);

}

}/*直接选择排序

算法思想:每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中的第i个记录

时间复杂度 o(n^2)

空间复杂度 o(1) ?

比较次数  n(n+1)/2*/intSelectMinKey(intarray[],intiPos,intlen)

{intret=0;for(inti=iPos; i

{if(array[ret]>array[i])

{

ret=i;

}

}returnret;

}voidselect_sort(intarray[],intlen)

{for(inti=0; i

{intj=SelectMinKey(array,i,len);if(i!=j)

{

swap(array[i],array[j]);

}

}

}/*归并排序

算法思想:设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先

将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。

时间复杂度 o(nlogn)

空间复杂度 o(n)

比较次数  ?*/voidmerge(intarray[],inti,intm,intn)

{intj,k;intiStart=i, iEnd=n;intarrayDest[256];for( j=m+1,k=i; i<=m&&j<=n;++k)

{if(array[i]

arrayDest[k]=array[i++];elsearrayDest[k]=array[j++];

}if(i<=m)for(;k<=n; k++,i++)

arrayDest[k]=array[i];if(j<=n)for(;k<=n; k++,j++)

arrayDest[k]=array[j];for(j=iStart; j<=iEnd; j++)

array[j]=arrayDest[j];

}voidmerge_sort(intarray[],ints,intt)

{intm;if(s

{

m=(s+t )/2;

merge_sort(array,s,m);

merge_sort(array,m+1,t);

merge(array,s,m,t);

}

}/*堆排序

算法思想:堆排序(Heap Sort)是指利用堆(heaps)这种数据结构来构造的一种排序算法。

堆是一个近似完全二叉树结构,并同时满足堆属性:即子节点的键值或索引总是

小于(或者大于)它的父节点。

时间复杂度 o(nlogn)

空间复杂度 o(1)

比较次数  较多*/voidheap_adjust(intarray[],inti,intlen)

{intrc=array[i];for(intj=2*i; j

{if(j=array[j])break;

array[i]=array[j]; i=j;

}

array[i]=rc;

}voidheap_sort(intarray[],intlen)

{inti;for(i=(len-1)/2; i>=0; i--)

heap_adjust(array,i,len);for(  i=(len-1); i>0; i--)

{

swap(array[0],array[i]);//弹出最大值,重新对i-1个元素建堆heap_adjust(array,0,i-1);

}

}intmain() {intarray[]={45,56,76,234,1,34,23,2,3,55,88,100};intlen=sizeof(array)/sizeof(int);//bubble_sort(array,len);//冒泡排序/*insert_sort(array,len);*///插入排序/*bi_insert_sort(array,len);*///二路插入排序/*shell_sort(array,len);*///希尔排序/*quick_sort(array,0,len-1);*///快速排序/*select_sort(array,len);*///选择排序/*merge_sort(array,0,len-1);*///归并排序heap_sort(array,len);//堆排序display(array,len);return0;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值