基本算法(一):插入排序,归并排序

基础的排序的算法:

插入排序, 归并算法

 

插入排序:

package alg;

import java.util.Arrays;

/**
 * @author zha 插入排序,基础的算法 算法复杂度为O(n2)
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] array = { 5, 2, 4, 6, 1, 3, 23, 434, 55, 6, 788, 89, 0 };
        insertSort(array, 0, array.length);
        System.out.println(Arrays.toString(array));
    }

    public static   <T extends Comparable<T>> T[] insertSort(T[] array, int begine, int length) {
        // 插入排序要就插入前面的序列式有序的
        for (int i = begine + 1; i < length; i++) {
             T key = array[i];
            int j = i - 1;
            for (; j >= begine; j--) {
                if (array[j].compareTo(key) > 0){
                    array[j + 1] = array[j];
                } else {
                    // 得到插入点的时候直接的跳出
                    break;
                }
            }
            array[j + 1] = key;
        }

        return array;
    }

    public static int[] insertSort(int[] array, int begine, int length) {

        // 插入排序要就插入前面的序列式有序的
        for (int i = begine + 1; i < length; i++) {
            int key = array[i];
            int j = i - 1;
            for (; j >= begine; j--) {
                if (array[j] > key) {
                    array[j + 1] = array[j];
                } else {
                    // 得到插入点的时候直接的跳出
                    break;
                }
            }
            array[j + 1] = key;
        }

        return array;
    }

}

归算法:

package alg;

import java.util.Arrays;

/**
 * @author zha
 * 归并算法,重在思想
 */
public class MergeSort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] array = { 5, 2, 4, 6, 1, 3, 23, 434, 55, 6, 788, 89, 0 };
        mergeSort(array, 0, array.length-1);
        System.out.println(Arrays.toString(array));

    }

    private static void mergeSort(int[] array, int start, int end ) {

        if(start < end){
            int mid = (start + end)>> 1;
            mergeSort(array, start, mid);
            mergeSort(array, mid+1, end);
            merge(array, start, mid,end);
        }
        
        
        
        
    }

    /**
     * 合并排序中合并的两端都是有序的,哨兵牌的使用
     * 哨兵的作用比较的不太好
     * */
    private static void merge(int[] array, int start, int mid, int end) {
        // 创建两个变量,用来存储中间的变量
        int firstl = mid - start+1;
        int secondl = end -mid;
        int[] first = new int[firstl +1];
        int[] second = new int[secondl+1];
        
        for (int i = 0; i < firstl; i++) {
            first[i] = array[start+i];
        }
        
        for (int i = 0; i < secondl; i++) {
            second[i] = array[mid +i +1];
        }
        
        first[firstl] = Integer.MAX_VALUE;
        second[secondl] = Integer.MAX_VALUE;
        
        int ii = 0 , jj =0;
        for (int pp = start; pp <= end; pp++) {
            if(first[ii] <= second[jj]){
                array[pp] = first[ii];
                ii++;
            }else{
                array[pp] = second[jj];
                jj++;
            }
        }
        
        
    }

}
posted @ 2014-11-12 20:22  长天秋水落霞孤鹜  阅读(148)  评论(0编辑  收藏  举报