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

基础的排序的算法:

插入排序, 归并算法

 

插入排序:

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++;

            }

        }

        

        

    }



}

你可能感兴趣的:(插入排序)