zoukankan      html  css  js  c++  java
  • 新手讲排序:希尔排序

    一.  希尔排序的实质是分组插入排序,又称为缩小增量排序,是不稳定的排序,并且时效分析很难,因为增量选择的关系

    二.  思想:将数组按照增量分为若干个子序列分别进行直接插入排序,然后缩减该增量,直到增量等于1,此时该数组基本有序,对该数组进行一次直接插入排序,效率比直接插入高

    三.  例子

           假设有十个数 num[10]={  5,7,9,10,23,15,13,67,78,32 } 

            (1)开始时我们选择增量等于d=len/2=5;此时将数组分为5组,也就是[ i , i+d ];    0 <= i <= 4;

            (2)if( num [i] >num [i+d] )  swap(num [i] , num [i+d] );  第一次分组插入排序完成

        (3)d=d/2=2; 此时将数组分为 2 组 ,然后重复步骤 2 ,进行排序 ,此时该数组基本有序,再进行一次直接插入排序,

        (4)d=d/2<=1;已经实现排序

    四.代码

     1 #include<iostream>
     2  using namespace std;
     3  void shell_sort(int *a,int len){
     4      //定义增量 
     5      int d=len;
     6      //依次缩小增量,每次缩小一半 
     7      while(d>1){
     8          d=(d+1)/2;
     9          //将他们分为d个组,分别对每个组进行插入排序 
    10          for(int i=0;i<len-d;i++){
    11              if(a[i]>a[i+d]){
    12                  int tmp=a[i];
    13                  a[i]=a[i+d];
    14                  a[i+d]=tmp;
    15              }
    16          }
    17          for(int i=0;i<len;i++)
    18              cout<<a[i]<<" ";
    19          cout<<endl;
    20      }
    21  }
    22  int main(){
    23      int a[20];
    24      int N,m,i,j;
    25      cin>>N;
    26      for(i=0;i<N;i++){
    27          cin>>a[i];
    28      }
    29      shell_sort(a,N);
    30      for(i=0;i<N;i++)
    31              cout<<a[i]<<" ";
    32      cout<<endl;
    33      return 0;
    34  }
    c++希尔排序
  • 相关阅读:
    程序员是怎么炼成的---OC题集--练习答案与题目(3)
    程序员是怎么炼成的---OC题集--练习答案与题目(2)
    152. Maximum Product Subarray
    151. Reverse Words in a String
    150. Evaluate Reverse Polish Notation
    148. Sort List
    147. Insertion Sort List
    145. Binary Tree Postorder Traversal
    144. Binary Tree Preorder Traversal
    140. Word Break II
  • 原文地址:https://www.cnblogs.com/jijiji/p/4787946.html
Copyright © 2011-2022 走看看