zoukankan      html  css  js  c++  java
  • 希尔排序之Java实现

    希尔排序之Java实现

    一、方法一

     1 package cn.com.zfc.lesson21.sort;
     2 
     3 /**
     4  * 
     5  * @title ShellSort
     6  * @describe 希尔排序 1959 年发明的
     7  * @author 张富昌
     8  * @date 2016年10月1日下午5:35:50
     9  */
    10 public class ShellSort_1 {
    11     // 希尔排序是对插入排序的一种改进。
    12     // 基本思想:先将整个待排数据元素序列分割成若干个子序列,分别对各个子序列进行直接插入排序。
    13     // 等整个序列中的数据元素“基本有序”时,在对整体元素进行一次直接插入排序
    14     // 时间复杂度:O(n) ~ O(n^2)
    15     public static void main(String[] args) {
    16         // 声明整型数组
    17         int[] array = new int[10];
    18         // 使用循环和随机数初始化数组
    19         for (int i = 0; i < array.length; i++) {
    20             array[i] = (int) Math.round(Math.random() * 100);
    21         }
    22         System.out.println("原始数组为:");
    23         for (int i : array) {
    24             System.out.print(i + " ");
    25         }
    26         System.out.println();
    27         System.out.println("排序后的数组为:");
    28         array = shellSort(array);
    29         for (int i : array) {
    30             System.out.print(i + " ");
    31         }
    32     }
    33 
    34     /**
    35      * 
    36      * 功能:冒泡排序的变种,希尔排序的基本思想是:首先按照一个序列递减的方法逐渐进行排序
    37      * 
    38      * 参数:int[] array
    39      *
    40      * 返回类型:int[]
    41      */
    42     public static int[] shellSort(int[] array) {
    43         // 使用临时数组,替代原始数组
    44         int[] arr = array;
    45         // 以增量 i进行直接插入排序
    46         int gap = arr.length;
    47         do {
    48             gap = gap / 2;
    49             for (int i = gap; i < arr.length; i++) {
    50                 for (int j = i; j >= gap; j -= gap) {
    51                     // 较小的数排在前面
    52                     if (arr[j] < arr[j - gap]) {
    53                         int temp = arr[j];
    54                         arr[j] = arr[j - gap];
    55                         arr[j - gap] = temp;
    56                     } else {
    57                         break;
    58                     }
    59                 }
    60             }
    61         } while (gap > 1);
    62 
    63         return arr;
    64     }
    65 }

    运行结果:

    二、方法二

     1 package cn.com.zfc.lesson21.sort;
     2 
     3 /**
     4  * 
     5  * @title ShellSort
     6  * @describe 希尔排序 1959 年发明的
     7  * @author 张富昌
     8  * @date 2016年10月1日下午5:35:50
     9  */
    10 public class ShellSort_2 {
    11     // 希尔排序是对插入排序的一种改进。
    12     // 基本思想:先将整个待排数据元素序列分割成若干个子序列,分别对各个子序列进行直接插入排序。
    13     // 等整个序列中的数据元素“基本有序”时,在对整体元素进行一次直接插入排序
    14     // 时间复杂度:O(n) ~ O(n^2)
    15 
    16     public static void main(String[] args) {
    17         // 声明整型数组
    18         int[] array = new int[10];
    19         // 使用循环和随机数初始化数组
    20         for (int i = 0; i < array.length; i++) {
    21             array[i] = (int) Math.round(Math.random() * 100);
    22         }
    23         System.out.println("原始数组为:");
    24         for (int i : array) {
    25             System.out.print(i + " ");
    26         }
    27         System.out.println();
    28         System.out.println("排序后的数组为:");
    29         array = shellSort(array);
    30         for (int i : array) {
    31             System.out.print(i + " ");
    32         }
    33     }
    34 
    35     /**
    36      * 
    37      * 功能:冒泡排序的变种,希尔排序的基本思想是:首先按照一个序列递减的方法逐渐进行排序
    38      * 
    39      * 参数:int[] array
    40      *
    41      * 返回类型:int[]
    42      */
    43     public static int[] shellSort(int[] array) {
    44         // 使用临时数组,替代原始数组
    45         int[] arr = array;
    46         // 以增量 i进行直接插入排序
    47         int gap = arr.length;
    48         // 临时变量
    49         int j, temp;
    50         do {
    51             gap = gap / 2;
    52             for (int i = gap; i < arr.length; i++) {
    53                 if (arr[i] < arr[i - gap]) {
    54                     temp = arr[i];
    55                     for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {
    56                         arr[j + gap] = arr[j];
    57                     }
    58                     arr[j + gap] = temp;
    59                 }
    60             }
    61         } while (gap > 1);
    62 
    63         return arr;
    64     }
    65 }

    运行结果:

     

  • 相关阅读:
    C语言速记3(作用域,枚举)
    c语言static在java语言区别
    c语言速记2(存储类,运算符)
    寄存器,计数器
    C语言extern的概念(声明和定义的区别)
    c语言速记1(基本结构,编译运行,声明定义,类型,常量)
    硬盘分区的相关概念(主分区,扩展分区,逻辑分区,MBR,DBR)
    android源码场景1(环境配置)
    c#截取两个指定字符串中间的字符串(转载)
    toFixed、Math.round 的区别(转载)
  • 原文地址:https://www.cnblogs.com/zfc-java/p/7941056.html
Copyright © 2011-2022 走看看