`
xiang37
  • 浏览: 415143 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java各种排序

 
阅读更多

Java排序分类为:

 

 * 1.插入排序(直接插入排序、折半插入排序、希尔排序); 

 * 2.交换排序(冒泡排序、快速排序); 

 * 3.选择排序(直接选择排序、堆排序); 

 * 4.归并排序; 

 * 5.基数排序。

 

下面实现代码为:

 

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xiva.baseKnowledge;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;


/**
 * 1.插入排序(直接插入排序、折半插入排序、希尔排序); 
 * 2.交换排序(冒泡排序、快速排序); 
 * 3.选择排序(直接选择排序、堆排序); 
 * 4.归并排序; 
 * 5.基数排序。 
 * @author XIVA
 */
public class SortPractice <T extends Comparable> {
    
    /**
     * 直接插入排序
     * @Description 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排
            好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
            也是排好顺序的。如此反复循环,直到全部排好顺序
     * @param  array needing to sort
     * @param  direction of sorting, 0 represent desc, 1 represent asc, others don't sorting.
     */
    public void directInsertSort(T[] array, int direction){
        
        //升序
        if( direction == 1){
            for(int i=0; i< array.length; i++){
                for(int j=0; j< i; j ++){
                    if( array[i].compareTo(array[j]) < 0 ){
                        T temp = array[i];
                        //后移一位
                        for( int k = i; k > j; k--){
                            array[k] = array[k-1];
                        }
                         array[j] = temp;
                        break;
                    }
                }
            }
        }
        
        //降序
        if( direction == 0){
            for( int i=0; i< array.length; i++ ){
                for(int j=0; j< i; j ++){
                    if( array[i].compareTo(array[j]) > 0 ){
                        T temp = array[i];
                        //后移一位
                        for( int k = i; k > j; k--){
                            array[k] = array[k-1];
                        }
                        array[j] = temp;
                        break;
                    }
                }
            }
        }
        
    }
    
    
    /**
     * 折半插入排序
     * 当第i个数插入时,前面i-i个数都已经排好序了,我们没有必要从第一个数开始比较大小;
     * 我们可以从第(i-i)/2个数开始比较大小,
     * @param array
     * @param direction 
     */
    public void binaryInsertSort(T[] array, int direction){
        
        int index, position, low, high = 0;
        T temp;
        //升序
        if( direction == 1){
            for(int i = 1; i< array.length; i++){
                low  = 0;
                high = i - 1;
                temp = array[i];
                while(low <= high){
                    index = (low + high) >> 1;
                    if( array[i].compareTo(array[index]) > 0 ){
                        low  = index + 1;
                    }else if( array[i].compareTo(array[index]) < 0 ){
                        high = index - 1;
                    }else{
                        break;
                    }
                }
                position = i;
                while(position > low){
                    array[position] = array[position-1];
                    position--;
                }
                array[low] = temp;
            }
        }
        
    }
    
    /**
     * 希尔排序
     * 先取一个正整数d1小于n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;
     * 然后取d2小于d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止
     * @Description 
     * @param array 需要排序数组
     * @param direction 0 desc,1 asc;
     */
    public void shellSort(T[] array, int direction){
        
        int len = array.length;
        int jump = len;
        T temp;
        while( jump > 1){
            jump = jump >> 1;
            for(int i = 0; i < jump; i++){
                //下面属于直接插入排序
                for( int j = i; j < len; j = j + jump){
                    for(int k = i; k < j; k = k + jump){
                       if( direction == 1 ){
                           if( array[j].compareTo(array[k]) < 0 ){
                                temp = array[k];
                                array[k] = array[j];
                                array[j] = temp;
                           }
                       }
                       else{
                           if( array[j].compareTo(array[k]) > 0 ){
                                temp = array[k];
                                array[k] = array[j];
                                array[j] = temp;
                            }
                       }
                    }
                }
            }
        }       
    }
    
    /**
     * 冒泡排序
     *  依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
     *  然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
     *  至此第一趟结束,将最大的数放到了最后。
     *  在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),
     *  将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),
     *  第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
     *  如此下去,重复以上过程,直至最终完成排序。
     * @param array
     * @param direction 
     */
    public void bubbleSort( T[] array, int direction ){
        
        int len = array.length;
        T temp;

            for( int i=0; i < len; i++ ){
                for(int j = i; j < len - 1; j++ ){
                    if ( direction == 1 ){
                        if( array[i].compareTo(array[j + 1]) > 0){
                            temp = array[i];
                            array[i] = array[j + 1];
                            array[j + 1] = temp;
                        }
                    }else if( direction == 0 ){
                        if( array[i].compareTo(array[j + 1]) < 0){
                            temp = array[i];
                            array[i] = array[j + 1];
                            array[j + 1] = temp;
                        }
                    }
                }
            }
    }
    
    /**
     * 快速排序
     * @Description 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
     * 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
     * @param array
     * @param direction , int i,  int j, int direction
     */
    public void quickSort( T[] array, int start, int end ){
        
        int keyIndex  = start;    
        int compIndex = end;
        T temp;
        if( end <= start){
            return;
        }
        while(true){
            if( compIndex  == keyIndex ){
                break;
            }
            if( array[keyIndex].compareTo(array[compIndex] ) > 0 ){
                if( keyIndex < compIndex ){
                    temp = array[keyIndex];
                    array[keyIndex] = array[compIndex];
                    array[compIndex] = temp;
                    //交换keyIndex与compIndex的值
                    keyIndex = keyIndex + compIndex;
                    compIndex = keyIndex - compIndex + 1;
                    keyIndex = keyIndex - compIndex + 1;
                }else{
                    compIndex = compIndex + 1;
                }
            }else if( array[keyIndex].compareTo(array[compIndex]) < 0 ){
                if( keyIndex > compIndex ){
                    temp = array[keyIndex];
                    array[ keyIndex ] = array[ compIndex ];
                    array[ compIndex] = temp;
                    //交换keyIndex与compIndex的值
                    keyIndex = keyIndex + compIndex;
                    compIndex = keyIndex - compIndex - 1;
                    keyIndex = keyIndex - compIndex - 1;
                }else{
                    compIndex = compIndex - 1;
                }
            }else{
                if( keyIndex < compIndex ){
                    //交换keyIndex与compIndex的值
                    keyIndex = keyIndex + compIndex;
                    compIndex = keyIndex - compIndex + 1;
                    keyIndex = keyIndex - compIndex + 1;
                }else{
                    //交换keyIndex与compIndex的值
                    keyIndex = keyIndex + compIndex;
                    compIndex = keyIndex - compIndex - 1;
                    keyIndex = keyIndex - compIndex - 1;
                }
            }
        }
        
        //递归
        quickSort(array, start, keyIndex - 1 );
        quickSort(array, keyIndex + 1, end );
    }    

    
    /**
     * @Description 直接选择排序 
     *  和冒泡排序类似,莫要混淆了
     * 第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R{1}~R[n-1]中选取最小值,与R[1]交换,....,
     * 第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,
     * 总共通过n-1次,得到一个按排序码从小到大排列的有序序列.
     * 冒泡排序每一次比较都有可能交换值;这个需要记住每一趟最大值或者最小值的位置
     * @param array 
     * @param direction 
     */
    public void straightSelectSort(T[] array, int direction){
        
        int len = array.length;
        T mTempData;
        int change_index;
        for( int i = 0; i < len; i++ ){
            mTempData = array[i];
            change_index = i;
            for( int j = i; j < len; j++ ){
                if( mTempData.compareTo(array[j]) > 0){
                    mTempData = array[j];
                    change_index = j;//记住最大值的位置
                }
            }
            array[change_index] = array[i];
            array[i] = mTempData;
        }
        
    }
    
    
    /**
     * 最大堆
     * @param array
     * @param i 
     */
    public void maxHeapify( T[] array, int i){
        
        int left = 2*i+1;  
        int right = 2*i+2;  
        int max = i; 
        
        //先判断左子节点  
        if( left < array.length && array[max].compareTo(array[left]) < 0 ){
            max = left;
        }
        
        //需要确定右子节点是否存在  
        if( right < array.length && array[max].compareTo(array[right]) < 0 ){
            max = right;
        }
        
        if( max != i ){
            //System.out.println("swap");
            T tmp = array[max];
            array[max] = array[i];
            array[i] = tmp;
            maxHeapify(array, max);
        }
    }

    
    /**
     * 最小堆
     * @param array
     * @param i 
     */
    public void minHeapify( T[] array, int i){
        
        int left = 2*i+1;
        int right = 2*i+2;
        int max = i;
        
        //先判断左子节点
        if(  left < array.length && array[max].compareTo(array[left]) > 0 ){
            max = left;
        }
        
        //需要确定右子节点是否存在  
        if( right < array.length && array[max].compareTo(array[right]) > 0 ){
            max = right;
        }
        
        if( max != i ){
            //System.out.println("swap");
            T tmp = array[max];
            array[max] = array[i];
            array[i] = tmp;
            minHeapify(array, max);
        }
    }
    
    
    
    /**
     * 创建堆
     * 堆从逻辑上讲是一种非线性结构,但实际中我们使用线性结构来存储;堆首先是一个完全二叉树,根节点的值是最大值(最小值)
     * @param array
     */
    public void createHeap( T[] array ){
        
        int len = (array.length-1)/2;
        
        for ( int i = len; i >= 0; i-- ){
            //maxHeapify(array, i);
            minHeapify(array, i);
        }
    }
    
    /**
     * 堆排序
     *  
     * @param array
     * @param direction
     */
    public T[] heapSort(T[] array,T[] result, int direction){
        
        int index = 0;
        int len = array.length;
        //取出堆顶,重复建堆
        for ( int i = len-1; i >= 0; i-- ){
            result[index] = array[0];
            index++;
            array[0] = array[array.length-1];
            array = Arrays.copyOfRange(array, 0, i);
            minHeapify(array, 0);
            //maxHeapify(array, 0);
        }
        return result;
    }
    
    public void merge ( T[] array, int low, int mid, int high){
        //T[] tempArr = new Object<T>[high - low];
        List<T> tempList = new LinkedList<T>();
        int s1 = low;
        int s2 = mid + 1;
        while( s1 <= mid && s2 <= high ){
            if( array[s1].compareTo(array[s2]) <= 0){
                tempList.add(array[s1++]);
            }else{
                tempList.add(array[s2++]);
            }
        }
        
        if(s1 <= mid){
            for(int i=s1; i <= mid; i++){
                tempList.add(array[i]);
            }
        }
        
        if(s2 <= high){
            for(int i=s2; i <= high; i++){
                tempList.add(array[i]);
            }
        }
        
        Object[] arrayList =  tempList.toArray();
        System.out.println(Arrays.toString(arrayList) + low + ":" + high);
        for (int i=0;i<arrayList.length;i++){
            array[low + i] = (T)arrayList[i];
        }
        tempList.clear();
    }
    
    /**
     * 归并排序
     * @param array
     * @param low
     * @param high 
     */
    public void mergeSort( T[] array,int low, int high){
        //int len = array.length;
        if (low < high){
            mergeSort(array, low, (low + high)/2);
            mergeSort(array, (low + high)/2 + 1, high);
            merge(array, low, (low + high)/2, high);
        }
        
    }
    
    public static void main(String[] args){
        
        SortPractice sort = new SortPractice();
        
        Integer num01 = new Integer(12);
        Integer num02 = new Integer(13);
        Integer num03 = new Integer(44);
        Integer num04 = new Integer(3);
        Integer num05 = new Integer(13);
        Integer num06 = new Integer(5);
        Integer num07 = new Integer(7);
        
        Integer[] array = {num01, num02, num03, num04, num05, num06, num07, num04};
        //Integer[] result = new Integer[array.length];
        //sort.directInsertSort(array, 1);
        //sort.binaryInsertSort(array, 1);
        //sort.shellSort(array, 1);
        System.out.println(Arrays.toString(array));
        sort.mergeSort(array, 0, array.length - 1);
        //sort.bubbleSort(array, 1);
        //sort.quickSort(array, 0, array.length - 1);
        //sort.createHeap(array);
        System.out.println(Arrays.toString(array));
        //sort.heapSort(array, result, 1);
        //System.out.println(Arrays.toString(result));
        /*for( int i=0; i < array.length; i++ ){
            System.out.println( array[i] );
        }*/
        
    }
}

 还有基数排序未实现。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics