zoukankan      html  css  js  c++  java
  • 排序算法总结

    内排序主要类型:

    各排序算法比较:

     选择合适的排序方法应综合考虑以下因素:

    1、待排序的记录数目n

    2、记录的大小(规模)

    3、关键字的结构及其初始状态

    4、对稳定性的要求

    5、语言工具的条件

    6、存储结构

    7、时间和辅助空间的复杂度等

    不同条件下,排序算法的选择:

    1、若n较小(n<50)可采用直插法和简单选择法

    2、若文件初始状态基本有序(正序),则应选用直插法、冒泡或随机的快速排序为宜

    3、若n较大、则应采用时间复杂度为o(nlgn)的排序方法:堆排序、归并排序、快速排序

       快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布的,快速排序的平均时间最短

         堆排序需要的辅助空间少于快速排序,并且不会出现快排可能出现的最坏情况

    希尔排序

    package com.flyoung;
    
    public class TestShell {
    
        public static void shellSort(int[] array){
            int i,j;
            int increment = array.length-1;
            do{
                increment = increment/3+1;
                for(i=increment+1;i<=array.length-1;i++){
                    if(array[i]<array[i-increment]){
                        array[0]=array[i];
                        for(j=i-increment;j>0&&array[0]<array[j];j-=increment){
                            array[j+increment]=array[j];
                        }
                        array[j+increment]=array[0];
                    }
                }
            }while(increment>1);
            
        }
        public static void main(String[] args) {
            int[] a = {0,9,1,5,8,3,7,4,6,2};
            shellSort(a);
            for(int i=1;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
        }
    
    }

    简单选择排序

    package com.flyoung;
    
    public class TestSelect {
    
        public static void selectSort(int[] array){
            int i,j,min;
            for(i=0;i<array.length-1;i++){
                min=i;
                for(j=i+1;j<=array.length-1;j++){
                    if(array[min]>array[j]){
                        min=j;
                    }
                }
                if(min!=i){
                    swap(array,i,min);
                }
            }
            
        }
        public static void swap(int[] array,int i,int j){
            int temp;
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
            
        }
        public static void main(String[] args) {
            int[] a = {20,10,30,40,90,100,80,60,50,70};
            selectSort(a);
            for(int i=0;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
        }
    }

    堆排序

    package com.flyoung;
    
    public class TestHeap {
        
        public static void heapAjust(int[] array,int s,int m){
            int temp,j;
            temp = array[s];
            for(j=2*s;j<=m;j*=2){
                if(j<m&&array[j]<array[j+1]){          //比较左右孩子结点
                    ++j;
                }
                if(temp>=array[j]){
                    break;
                }
                array[s]=array[j];                  //交换结点值
                s=j;    
            }
            array[s]=temp;
            
        }
        
        public static void heapSort(int[] array){
            int i;
            for(i=(array.length-1)/2;i>0;i--){            //建堆
                heapAjust(array,i,array.length-1);
            }
            for(i=array.length-1;i>1;i--){                    //根节点和最后一个结点交换,再调整
                swap(array,1,i);
                heapAjust(array,1,i-1);
            }
        }
        public static void swap(int[] a,int i,int j){
            int temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
        public static void main(String[] args) {
            int [] a={0,3,2,4,1,5,7,9,8,6};
            heapSort(a);
            for(int i=1;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
    
        }
    
    }

    冒泡排序

    package com.flyoung;
    
    public class TestBubble {
    
        public static void bubbleSort(int[] array){
            int i,j;
            boolean flag = true;
            int len = array.length-1;
            for(i=1;i<len&&flag;i++){
                flag = false;
                for(j=len-1;j>=i;j--){
                    if(array[j]>array[j+1]){
                        swap(array,j,j+1);
                        flag=true;
                    }
                }
            }
        }
        public static void swap(int[] array,int i,int j){
            array[0]=array[i];
            array[i]=array[j];
            array[j]=array[0];
        }
        public static void main(String[] args) {
            int[] a = {0,9,1,5,8,3,7,4,6,2};
            bubbleSort(a);
            for(int i=1;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
    
        }
    
    }

    快速排序

    package com.flyoung;
    
    public class TestQuick {
        public static void quickSort(int[] array){
            qSort(array,1,array.length-1);
        }
        public static void qSort(int[] array,int low,int high){
            int privot ;
            if(low<high){
                privot=partition(array,low,high);
                qSort(array,low,privot-1);
                qSort(array,privot+1,high);
            }
            
        }
        public static int partition(int[] array,int low,int high){
            int m = low+(high-low)/2;
            if(array[low]>array[high]){
                swap(array,low,high);
            }
            if(array[m]>array[high]){
                swap(array,m,high);
            }
            if(array[m]>array[low]){
                swap(array,m,low);
            }
            int privotKey = array[low];
            array[0]=privotKey;
            while(low<high){
                while(low<high&&array[high]>privotKey){
                    high--;
                }
                array[low]=array[high];
                while(low<high&&array[low]<privotKey){
                    low++;
                }
                array[high]=array[low];
            }
            array[low]=array[0];
            return low;
        }
        public static void swap(int[] array,int i,int j){
            int temp=array[i];
            array[i]=array[j];
            array[j]=temp;
        }
        public static void main(String[] args) {
            int[] a = {0,56,78,12,45,90,88,59,100,23};
            quickSort(a);
            for(int i=1;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
        }
    
    }

    归并排序

    package com.flyoung;
    
    public class TestMerge {
    public static void merge(int[] array,int start1,int end1,int start2,int end2){
        int i=start1,j=start2;
        int[] temp = new int[end2-start1+1];
        int k=0;
        while(i<=end1&&j<=end2){
            temp[k++]=array[i]<=array[j]?array[i++]:array[j++];
        }
        while(i<=end1){
            temp[k++]=array[i++];
        }
        while(j<=end2){
            temp[k++]=array[j++];
        }
        k=start1;//关键处,不然每次都会从下标0处开始
        for(int element:temp){
            array[k++]=element;
        }
        
    }
    public static void mergeSort(int[] array,int s,int t){
        if(s<t){
              int m = (s+t)/2;
                mergeSort(array,s,m);
                mergeSort(array,m+1,t);
                merge(array,s,m,m+1,t);
        }
    }
        public static void main(String[] args) {
            int[] a={50,10,60,40,80,90,100,20,30,50};
            mergeSort(a,0,a.length-1);
            for(int i=0;i<a.length;i++){
                System.out.println("a["+i+"]:"+a[i]);
            }
        }
    
    }
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    分享到: 更多
  • 相关阅读:
    perl文本输出对齐
    putty配色方案
    java线程 同步与异步 线程池
    android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
    真正能获得基站LBS定位的android程序包括GSM、CDMA
    Android之TelephonyManager&GsmCellLocation类的方法详解
    网络编程之同步,阻塞,异步,非阻塞
    Android私有文件资源文件的存取
    [转]android 获取手机GSM/CDMA信号信息
    json格式转换
  • 原文地址:https://www.cnblogs.com/flyoung2008/p/2424124.html
Copyright © 2011-2022 走看看