温故而知新:C++常用排序算法

2016-02-19 20:21 6 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的温故而知新:C++常用排序算法教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 编程语言 】

选择排序法SelectionSort(int arr[],int n)
  

  
  template typename T
  void SelectionSort(T arr[],int n)
  {
  int smallIndex;   //表中最小元素的下标
  int pass,j;       //用来扫描子表的下标
  T temp;           //用来交换表元素的临时变量
  
  //pass的范围是0~n-2
  for (pass=0;passn-1;pass++)
  {
  //从下标pass开始扫描子表
  smallIndex=pass;
  
  //j遍历整个子表arr[pass+1]到arr[n-1]
  for(j=pass+1;jn;j++)
  
  //假如找到更小的元素,则将该位置赋值给smallIndex
  if(arr[j]arr[smallIndex])
  smallIndex=j;
  
  //假如smallIndex和pass不在相同的位置
  //则将子表中的最小项与arr[pass]交换
  if(smallIndex!=pass)
  {
  temp=arr[pass];
  arr[pass]=arr[smallIndex];
  arr[smallIndex]=temp;
  }
  }
  }   /************************************************************************
  双端选择排序算法:是上面选择排序算法的变种,可以定位每个子表中最小和最大元素
  并把它们分别放在子表的开头和结尾.
  ************************************************************************/
  //双端选择排序算法函数deSelSort()的实现
  
  template typename T
  void deSelSort(T arr[],int n)
  {
  int smallIndex,largeIndex;  //表中最小及最大元素的下标
  int leFTPass=0,rightPass=n-1,i,j;     //用来从表左边及右边扫描子表的下标
  T temp;                        //用于交换元素的临时变量
  

   更多内容请看C/C++技术专题专题,或
  
  
  while (leftPass=rightPass)
  {
  //从左边及右边开始扫描子表
  smallIndex=leftPass;
  largeIndex=rightPass;
  
  //j和i遍历整个子表arr[LeftPass]~arr[rightPass]
  for (i=leftPass+1;irightPass;i++)
  //假如找到更小的元素,则将该位置赋值给smallIndex
  if (arr[i]arr[smallIndex])
  smallIndex=i;
  
  //假如smallIndex和leftPass不在相同的位置
  //则将子表中的最小项与arr[pass]交换
  if (smallIndex!=leftPass)
  {
  temp=arr[leftPass];
  arr[leftPass]=arr[smallIndex];
  arr[smallIndex]=temp;
  }
  
  for (j=rightPass-1;jleftPass;j--)
  if(arr[j]arr[largeIndex])
  largeIndex=j;
  
  if(largeIndex!=rightPass)
  {
  temp=arr[rightPass];
  arr[rightPass]=arr[largeIndex];
  arr[largeIndex]=temp;
  }
  
  //从两头收缩子表
  leftPass++;
  rightPass--;
  }
  }   //自编冒泡法排序算法函数bubbleSort()的实现
  
  template typename T
  int bubbleSort(T arr[],int n)
  {
  bool exchanged=false; //是否发生交换
  int i,j;              //用于遍历子表的下标
  T temp;               //用于交换元素的临时变量
  
  

   更多内容请看C/C++技术专题专题,或
  
  
  //开始遍历过程,以下标j构成子表,共有n-1个子表
  for (j=n-1;j=0;j--) //j从后往前收缩n-1~0,以构成子表0~n-1,0~n-2,0~n-3..0~1
  {
  exchanged=false;
  for (i=0;ij;i++) //遍历子表范围0~j
  {
  
  if (arr[i]arr[i+1])
  {
  temp=arr[i];
  arr[i]=arr[i+1];
  arr[i+1]=temp;
  exchanged=true;
  }
  }
  if (!exchanged) return n-j-1;//假如在一次遍历中没有发生交换,则表示已经
  //排序好,中断遍历过程
  }
  return n-1-j;
  }   //冒泡法排序一般算法函数bubbleSortEx()的实现
  
  template typename T
  int bubbleSortEx(T arr[],int n)
  {
  int i,pass;              //用于遍历子表的下标
  T temp;               //用于交换元素的临时变量
  
  //开始遍历过程,以下标j构成子表,共有n-1个子表
  for (pass=0;passn;pass++) //pass从后往后扩大0~n-1,以构成子表0~n-1,0~n-2,0~n-3..0~1
  {
  for (i=0;in-pass;i++) //遍历子表范围0~n-pass
  {  
  if (arr[i]arr[i+1])
  {
  temp=arr[i];
  arr[i]=arr[i+1];
  arr[i+1]=temp;
  }
  }
  }
  return pass;
  }
  
  

   更多内容请看C/C++技术专题专题,或

来源:http://www.tulaoshi.com/n/20160219/1623415.html

延伸阅读
开发定点(fixed-point)算法时,通常需要在设计功能性、数字精度建模、及验证(仿真)速度之间取得一个平衡。现在,一种新的数据类可使此过程简单化,由此得到更简单精确的建模精度、更好的数字求精、及更快的验证周期,而ANSI C/C++正是开发这种数字求精算法的最佳语言。 某此算法天生就适用于操作整数,或那些理想中的实数(如数字滤波器的系数...
  在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。 以下两个例子要非常注重,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。 !-- frame contents -- !-- /frame contents -- #include stdio.h    void main(void)  {  ...
  这是我学数据结构编写的算法,我把他整理出来,都是基本算法,供大家学习。我使用c++面向对象形式编写,各种算法都封装在各自的类里,假如想增加功能,在相应的类里增加函数即可。我对树和图的构造也做了一些人性化设计,输入更加形象化,你可能看不懂,没关系漫漫来。各种类都使用模版设计,可以对各种数据类型操作(整形,字符,...
希尔排序的时间复杂度为O(n*log2n) 空间复杂度为O(1)是一种不稳定的排序算法 思想:希尔排序也是一种插入排序方法,实际上是一种分组插入方法。先取定一个小于n的整数d1作为第一个增量,把表的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序;然后,取第二个增量d2(<d1),重复上述的分组和排序,直至所取...
数据结构描述的是数据之间的关系。C++数据结构的存储方式有顺序、链接、索引、散列等形式,对数据的处理通常包括输入、输出、查找、更新、排序、插入、删除等,当数据的存储方式不同时,相应的处理实现算法也不尽相同。如何采用一种简便明了的方法分析C++的数据结构特点及各种存储方式、处理方式之间的异同成为了计算机应用专业教育的一个...

经验教程

220

收藏

35
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部