C语言常用排序全解

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  /*

  ================================================

  功能:冒泡排序

  输入:数组名称(也就是数组首地址)、数组中元素个数

  ================================================

  */

  /*

  ====================================================

  算法思想简单描述:

  在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

  下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的位置k,这样可以减少外层循环扫描的次数。

  冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方]

  =====================================================

  */

  void bubble_sort(int *x, int n)

  {

  int j, k, h, t;

  for (h=n-1; h>0; h=k) /*循环到没有比较范围*/

  {

  for (j=0, k=0; j

  {

  if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/

  {

  t = *(x+j);

  *(x+j) = *(x+j+1);

  *(x+j+1) = t; /*完成交换*/

  k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/

  }

  }

  }

  }

  /*

  ================================================

  功能:希尔排序

  输入:数组名称(也就是数组首地址)、数组中元素个数

  ================================================

  */

  /*

  ====================================================

  算法思想简单描述:

  在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

  下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,

  以后每次减半,直到增量为1。

  希尔排序是不稳定的。

  =====================================================

  */

  void shell_sort(int *x, int n)

  {

  int h, 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;

  }

  }

  }

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答