数据结构实验之排序六:希尔排序

来源:互联网 发布:淘宝怎么删除卖家评价 编辑:程序博客网 时间:2024/06/18 13:46

Think:
今天是第一次接触 “希尔排序”的方法。。。所以肯定有理解不到位的地方。。看来是时候开一个排序的分类的。。
希尔排序是插入排序中的一种,其中dk为增量,表示每次移动的增量。

Problem Description

我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)
Input

连续输入多组数据,每组输入数据的第一行给出一个正整数N(N <= 10000),随后连续给出N个整数表示待排序关键字,数字间以空格分隔。

Output

输出dk=n/2和dk=1时的结果。
Example Input

10
10 9 8 7 6 5 4 3 2 1
10
-5 9 7 -11 37 -22 99 288 33 66

Example Output

5 4 3 2 1 10 9 8 7 6
1 2 3 4 5 6 7 8 9 10
-22 9 7 -11 37 -5 99 288 33 66
-22 -11 -5 7 9 33 37 66 99 288

#include<bits/stdc++.h>using namespace std;void ShellSort1(int a[], int n); // dk = n / 2;void ShellSort2(int b[], int n); // dk = 1;int a[10050];int b[10050];int main() {   int n;   while(cin >> n)   {      int i;      memset(a, 0, sizeof(a));      memset(b, 0, sizeof(b));      for (i = 0;i <= n - 1;i ++)         {            cin >> a[i];            b[i] = a[i];         }        ShellSort1(a, n);       for (i = 0;i <= n - 1;i ++)         {            if (i == n - 1)              cout << a[i] << endl;              else              cout << a[i] << " ";         }        ShellSort2(b, n);         for (i = 0;i <= n - 1;i ++)         {            if (i == n - 1)              cout << b[i] << endl;              else              cout << b[i] << " ";         }   }  return 0; } void ShellSort1(int a[], int n)  {    int dk = n / 2;    int i, j, t;    for (i = dk;i <= n - 1;i ++)       {          for (j = i - dk;j >= 0;j = j - dk)              {                     if (a[j] > a[j + dk])                        {                           t = a[j];                           a[j] = a[j + dk];                           a[j + dk] = t;                        }              }       }  }   void ShellSort2(int b[], int n)   {    int dk = 1;    int i, j, t;    for (i = dk;i <= n - 1;i ++)       {          for (j = i - dk;j >= 0;j = j - dk)              {                     if (b[j] > b[j + dk])                        {                           t = b[j];                           b[j] = b[j + dk];                           b[j + dk] = t;                        }              }       }  }/***************************************************User name: Result: AcceptedTake time: 0msTake Memory: 240KBSubmit time: 2017-02-22 14:55:13****************************************************/
0 0
原创粉丝点击