zoukankan      html  css  js  c++  java
  • 希尔排序之C++实现(高级版)

    希尔排序之C++实现(高级版)

    一、源代码:ShellSortHigh.cpp

     1 /*希尔排序基本思想:
     2 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。
     3 所有距离为d1的倍数的记录放在同一个组中。
     4 先在各组内进行直接插入排序;
     5 然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  =1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
     6 */
     7 #include<iostream>
     8 using namespace std;
     9 /*定义输出一维数组的函数*/
    10 void print(int array[], int n)
    11 {
    12     for (int i = 0; i < n; i++)
    13     {
    14         cout << array[i] << " ";
    15     }
    16     cout << endl;
    17 }
    18 /*
    19 一种查找比较操作和记录移动操作交替地进行的方法。
    20 具体做法:
    21  将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:
    22   ① 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;
    23   ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。
    24    关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。
    25 
    26    */
    27 int shellSort(int array[], int n)
    28 {
    29     //定义变量,记录交换次数
    30     int count = 0;
    31     //定义中间变量,做为临时交换变量
    32     int temp;
    33     //遍历数组(进行排序)
    34     cout << "开始对数组进行排序了..." << endl;
    35     //定义初始增量值
    36     int gap = n;
    37     do{
    38         //初始增量变化规律
    39         gap = gap / 3 + 1;
    40         for (int i = gap; i < n; i++)
    41         {
    42             for (int j = i; j >= gap; j-=gap)
    43             {
    44                 if (array[j] < array[j - gap])
    45                 {
    46                     temp = array[j];
    47                     array[j] = array[j - gap];
    48                     array[j - gap] = temp;
    49                     cout << array[j] << "" << array[j - gap] << "互换了" << endl;
    50                     //输出此时数组的顺序
    51                     cout << "数组此时的顺序是:";
    52                     print(array, 10);
    53                     //每交换一次,记录数加1
    54                     count++;
    55                 }
    56                 else
    57                 {
    58                     break;
    59                 }
    60             }
    61         }
    62     } while (gap>1);
    63     cout << "数组排序结束了..." << endl;
    64     return count;
    65 }
    66 
    67 int main()
    68 {
    69     //定义待排序的一维数组
    70     int array[] = { 1, 3, 4, 5, 2, 6, 10, 9, 8, 7 };
    71     //输出原始数组
    72     cout << "原始数组是:" << endl;
    73     print(array, 10);
    74     //对数组进行排序
    75     int count = shellSort(array, 10);
    76     //输出排序后的数组
    77     cout << "排序后的数组是:" << endl;
    78     print(array, 10);
    79     cout << "共交换" << count << "" << endl;
    80     return 0;
    81 }

    二、运行效果

     

  • 相关阅读:
    elasticsearch 索引清理脚本及常用命令
    git 快速入门及常见用法
    第01章-成本,你真的算对过吗?
    windows mysql安装及常用命令
    centos7 systemctl配置开机自启动服务
    python pip手动安装二进制包
    centos7使用nginx+uwsgi部署python django项目
    python json.loads()、json.dumps()和json.dump()、json.load()区别
    比阿里云快2倍的InfluxDB集群,我们开源了
    为什么是InfluxDB | 写在《InfluxDB原理和实战》出版之际
  • 原文地址:https://www.cnblogs.com/zfc-java/p/7396429.html
Copyright © 2011-2022 走看看