zoukankan      html  css  js  c++  java
  • 写一个快排序,堆排序

    写一个快排序,堆排序需要多少时间?

     

          排序,作为计算机算法的基础知识之一,是每个程序员必备的技能之一,也许你不经常自己写排序,但是,如果自己写,试试需要多长时间,完整,正确的写好排序了?最简单的莫过于冒泡,选择排序。说白了,排序,莫过于三部走,一是如何遍历,二是比较,三是交换。其中遍历是关键!

      下面,对常用的快排序和堆排序进行实现,争取5分钟只能完成一个算法的书写。天下武功,唯快不破!快速实现而熟练的实现是一个程序员基本功底的体现。

    如何最简单,最快,而正确的实现了?那就是对10以内的整数排序,是最快的,最能看到效果的。首先了明确输入和输出。记住快排序的思想是找一个标杆,让后左右开工,分别找比标杆大小的进行交换。确定新的区间,然后递归实现。话不多说,开始:需要设计两个方法,一个实现一趟的操作,一个递归调用,完事。一下为java实现:(只要思路清晰,什么语言实现都无关紧要啦!)计时开始!

    复制代码
     1   
     2 /**  
     3  * filename:TestQuickSortS.java  
     4  * CopyRight:  
     5  * Date:2013-11-21  
     6  * Copyright JanneLee Corporation 2013   
     7  * Copyright
     8  * version 1.0 
     9  */  
    10 
    11 package com.lee.sort;
    12 
    13   
    14 /**  
    15  * Description:  
    16  * @author: JanneLee@gmail.com  
    17  * @date:2013-11-21 下午02:03:47
    18  * @version:1.0   
    19  */
    20 
    21 public class TestQuickSortS {
    22     private int Partion(int arr[],int low,int high){
    23         int pivotkey=arr[low];
    24         while(low<high){
    25             while(low<high&&arr[high]>=pivotkey){
    26                 --high;
    27             }
    28             arr[low]=arr[high];
    29             while(low<high&&arr[low]<=pivotkey){
    30                 ++low;
    31             }
    32             arr[high]=arr[low];
    33         }
    34         arr[low]=pivotkey;
    35         return low;
    36     }
    37     
    38     public void  QuickSort(int arr[],int low,int high) {
    39         if(low<high){
    40             int pivot=Partion(arr, low, high);
    41             QuickSort(arr, low, pivot-1);
    42             QuickSort(arr,pivot+1,high);
    43         }
    44     }
    45     /**
    46     *Description:[the test code]  
    47     *@author: JanneLeeMAC@gmail.com  
    48     *@date:2013-11-21 下午02:09:36
    49     *@version: 1.0
    50      */
    51     public static void  main(String args[]) {
    52         int arr[]={2,3,1,4,5};
    53         TestQuickSortS s = new TestQuickSortS();
    54         s.QuickSort(arr, 0, arr.length-1);
    55         for(int i=0;i<arr.length;++i){
    56             System.out.print(arr[i]+" ");
    57         }
    58     }
    59 }
    复制代码

    事实证明,这次没有超过5分。nice啊,不过,只能对整数排序,似乎不太爽,还有浮点,字符串等等啊。c++中有模板非常的棒,java中可以借助泛型,不过java中有Object类,还有一个非常爽的Compareable接口,好了,有了比较的工具。那就再改进一下比较方式呗。动手:

    复制代码
    package com.lee.sort;
    
    public class TestQuickSort {
        @SuppressWarnings("unchecked")
        private static int Partion(Object [] arr,int low,int high){
            Object pivotkey=arr[low];
            while(low<high){
                while(low<high&&((Comparable<Object>)arr[high]).compareTo((Comparable<Object>)pivotkey)>=0){
                    --high;
                }
                arr[low]=arr[high];
                while(low<high&&((Comparable<Object>)pivotkey).compareTo((Comparable<Object>)arr[low])>=0){
                    ++low;
                }
                arr[high]=arr[low];
            }
            arr[low]=pivotkey;
            return low;
        }
        
        public static void QuickSort(Object arr[],int low,int high){
            if(low<high){
                int pivot=Partion(arr, low, high);
                QuickSort(arr, low, pivot-1);
                QuickSort(arr, pivot+1, high);
            }
        }
        
        public static void main(String args[]){
            Object arr[]={1,3,4,2,0,-5,6,7}; 
    //        Object arr[]={1.1,3.3,4.2,2.2,0.1,-5.0,6.99999,7.0}; 
    //        Object arr[]={"how","are","you","i","am","fine","thanks","!"}; 
    //        Object arr[]={"123","432","213","124","a123","432","23412","adfa"}; 
            QuickSort(arr,0,arr.length-1);
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
        }
    }
    复制代码

      这次感觉是不是更爽了啊,哈哈。那就接着开始堆。基本的思想也是一样的,先简单写出来,再进行调整,堆是一颗完全二叉树。比较的规则是老子比两个儿子都大,或者老子比两个儿子都小。主要是遍历的技巧性。要先知道怎么调整一个堆,然后开始构造,不断的调整。也就是一个调整的方法,一个构造的方法,话不多说,开始:

    复制代码
     1 package com.lee.sort;
     2 
     3 public class TestHespSortS {
     4     private void HeapAdjust(int arr[],int start,int end){
     5         int temp=arr[start];
     6         int i=2*start+1;
     7         while(i<=end-1){
     8             if(i<end-1&&arr[i]<arr[i+1]){
     9                 ++i;
    10             }
    11             if(i<end-1&&temp<arr[i]){
    12                 arr[start]=arr[i];
    13                 start=i;
    14                 i=start+1;
    15             }else {
    16                 break;
    17             }
    18         }
    19         arr[start]=temp;
    20     }
    21     public void HeapSort(int arr[]) {
    22         int len=arr.length;
    23         for(int i=(len>>1)-1;i>=0;--i){
    24             HeapAdjust(arr, i,len);
    25         }
    26         int temp=0;
    27         while(len>0){
    28             temp=arr[0];
    29             arr[0]=arr[len-1];
    30             arr[len-1]=temp;
    31             HeapAdjust(arr, 0, --len);
    32         }
    33     }
    34     public static void main(String sags[]){
    35         int arr[]={1,3,2,4,6,5};
    36         TestHespSortS s = new TestHespSortS();
    37         s.HeapSort(arr);
    38         
    39         for(int i=0;i<arr.length;++i){
    40             System.out.print(arr[i]+" ");
    41         }
    42     }
    43 }
    复制代码

    丫的,堆排序就是麻烦,都写了10几分钟。主要是各种边界的问题。同样,写出适合跟多种类的堆排序。如下:

    复制代码
    package com.lee.sort;
    
    public class TestHeapSort{
        public static void main(String args[]){
             Object arr[]={1,3,4,2,6,-5,6,7};  //最开始测试数组
    //         Object arr[]={1.1,3.1,4.0,2.5,6.2,-5.2,6.2,7.2};  //最开始测试数组
    //         Object arr[]={"we","are","the","best","one","In","the","china"};  //最开始测试数组
    
            HeapSort(arr);
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
                
        }
        @SuppressWarnings("unchecked")
        public static void HeapAdjust(Object []arr,int start,int end){
            Object temp=arr[start];
            int i=2*start+1;
            while(i<=end-1){
                if(i<end-1&&((Comparable<Object>)arr[i]).compareTo((Comparable<Object>)arr[i+1])<0){
                    ++i;
                }
                if(((Comparable<Object>)temp).compareTo(((Comparable<Object>)arr[i]))<0){
                    arr[start]=arr[i];
                    start=i;
                    i=2*start+1;
                }else{
                    break;
                }
            }
            arr[start]=temp;
        }
        
        public static void  HeapSort(Object []arr) {
            int n=arr.length;
            for(int i=(n/2-1);i>=0;i--){
                HeapAdjust(arr, i, n);
            }
            Object tempObject=null;
            while(n>0){
                tempObject=arr[0];
                arr[0]=arr[n-1];
                arr[n-1]=tempObject;
                HeapAdjust(arr, 0, --n);
            }
        }
    }
    复制代码

    要牛,无他,但手熟尔。

  • 相关阅读:
    txtbox取Calendar值
    【Spread Sheet 应用(一)】去掉原有功能键及添加功能键
    【SQLSERVER】存储过程基础
    【SQLSERVER】在存储过程中调用存储过程
    ASP.NET跨页面传值技巧(VB.NET篇)
    【EXCEL】IF...ELSE语句
    VB单元测试
    【VB.NET】窗体之间传值
    【Spread Sheet 应用(二)】常用属性设置
    【SQLSERCER】创建、改变、删除索引
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3436492.html
Copyright © 2011-2022 走看看