C/C++实现八大排序算法汇总

2020-01-06 15:54:09于丽

算法实现:

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数

即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。


//shell排序
void Shell_Sort(int *list,int count)
{
 int i,j;
 int temp;
 int increment = count;
 do
 {
 increment = increment/2;
 for(i = increment;i<count;i++)
 {
  if(list[i]<list[i-increment])
  {
  temp = list[i];
  for(j=i-increment;j>=0&&list[j]>temp;j-=increment)
  {
   list[j+increment] = list[j];
  }
  list[j+increment] = temp;
  }
  
 }

 }while(increment>1);
}

希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。希尔排序时间复杂度的下界是n*log2n,因此中等大小规模表现良好。
3. 选择排序—简单选择排序(Simple Selection Sort)

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

 C++,排序算法

进行比较操作的时间复杂度为O(n^2),进行移动操作的时间复杂度为O(n)。简单选择排序是不稳定排序。

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

算法实现:


//选择排序
void Select_Sort(int *list,int count)
{
 int min,i,j;
 for(i=0;i<count;i++)
 {
 min = i;
 for(j=i+1;j<count;j++)
 {
  if(list[min]>list[j])
  {
  min = j;
  }
 }
 if(min!=i)
 {
  swap(list[i],list[min]);
 }
 }
}