zoukankan      html  css  js  c++  java
  • 数据结构--希尔排序和快速排序

     1 /*希尔排序:对插入排序的改进,其排序是按照一个增量序列来进行
     2  *增量序列的个数就是排序的趟数。在任意增量K下,保证a[i]<=a[i+k]
     3  *该算法的效率和增量需序列的选择有很大关系。
     4  *增量序列一般规则:h = 3h + 1;
     5  *希尔排序的效率总体比简单排序的好。
     6  * */
     7 public class ShellSort {
     8 
     9     public static void main(String[] args) {
    10         int[] list = {6,9,2,3,5,50,30,8,7,4,23,12};
    11         displayList(list);
    12         shellSort(list);
    13         displayList(list);
    14     }
    15     
    16     public static void shellSort(int[] arr){
    17         int inner,outer;
    18         int temp;
    19         int h = 1;
    20         while(h <= arr.length / 3){
    21             h = h * 3 + 1;
    22         }
    23         //外循环控制排序趟数
    24         while(h > 0){ 
    25             //控制每个增量的循环
    26             for(outer = h; outer < arr.length; outer++){
    27                 temp = arr[outer];
    28                 inner = outer;
    29                 
    30                 while(inner > h - 1 && arr[inner - h] >= temp){
    31                     arr[inner] = arr[inner - h];
    32                     inner = inner - h;
    33                 }
    34                 arr[inner] = temp;
    35             }
    36             h = (h - 1) / 3;
    37         }
    38     }
    39     
    40     public static void displayList(int[] arr){
    41         for(int i = 0; i < arr.length;i++){
    42             System.out.print(arr[i] + " ");
    43         }
    44         System.out.println();
    45     }
    46     
    47 }
     1 /*快速排序:将一个数组划分为两个子数组,递归调用自身为每个子数组进行快速排序。
     2  * 注意:确定好递归终止条件right - left <= 0
     3  * 每次划分组:是根据划分的思想确定出下次组的边界
     4  *2.划分思想:按照序列中的某个值将序列划分为两部分,右边值全部小于该值左边的部分全部大于该值,
     5  *该值的选择尽量接近该组序列的平均值.通过在设置两个指针,分别从相反的方向找到比中间值大的
     6  *和比中间值小的,交换,最后将中间值放在其位置上。
     7  *3.快速排序:通常来说是效率比较好的排序算法O(NlogN)
     8  *4.中枢值选择关键,最好两边长度差不多比较好,假如两边差的多,将导致多的一边过多的划分
     9  * 效率降低,序列无序度高效果会好点--对于随机选择的中枢值
    10  * */
    11 public class QuickSort {
    12 
    13     public static void main(String[] args) {
    14         int[] list = {3,2,5,7,5,38,20,18,27,39,12};
    15         displayList(list);
    16         quickSort(list);
    17         displayList(list);
    18     }
    19     
    20     public static void quickSort(int[] arr){
    21         recQuickSort(0,arr.length-1,arr);
    22     }
    23     
    24     private static void recQuickSort(int left, int right,int[] arr) {
    25         if(right - left <= 0){//size<=1.递归基准条件
    26             return;
    27         }
    28         else{
    29             int pivot = arr[right];
    30             //整理一次小的在一边大的在一边,并获得下次分组的边界
    31             int partition = partitionIt(left,right,pivot,arr);  
    32             recQuickSort(left, partition - 1, arr);
    33             recQuickSort(partition + 1, right, arr);
    34         }
    35         
    36     }
    37 
    38     public static int partitionIt(int left,int right,int pivot,int[] arr){
    39         int lefter = left - 1;   //第一个元素的左边
    40         int righter = right;  //最后一个元素
    41         
    42         while(true){
    43             while(arr[++lefter] < pivot);//左边直到找到比中间值大的一个元素
    44             
    45             while(righter > 0 && arr[--righter] > pivot);//右边直到找到比中间值小的一个元素
    46             
    47             if(lefter >= righter){
    48                 break;
    49             }
    50             else{
    51                 swap(lefter,righter,arr);   //交换两个元素
    52             }
    53         }
    54         swap(lefter,right,arr);   //将选定的中间值放其位置上
    55         return lefter;
    56         
    57     }
    58 
    59     private static void swap(int lefter, int righter,int[] list) {
    60         int temp = list[lefter];
    61         list[lefter] = list[righter];
    62         list[righter] = temp;
    63     }
    64     
    65     public static void displayList(int[] arr){
    66         for(int i = 0; i < arr.length;i++){
    67             System.out.print(arr[i] + " ");
    68         }
    69         System.out.println();
    70     }
    71 
    72 }
  • 相关阅读:
    生活中头疼脑热及医生诊断用药相关,持续更新
    python3 面试题 英文单词全部都是以首字母大写,逐个反转每个单词
    python 代码如何打包成.exe文件(Pyinstaller)
    charles使用
    经典bug
    python3面试-查找字符串数组中的最长公共前缀
    python3面试题 按规律写出下一个数1,11,21,1211,111221
    python3 测试的时候如何批量随机生成伪数据?(faker模块的)
    python3面试题-一个包含n个整数的数组a,判断a中是否存在三个元素,a,b,c,使得a+b+c=0
    python3面试-将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列
  • 原文地址:https://www.cnblogs.com/sun1993/p/7821924.html
Copyright © 2011-2022 走看看