一些排序算法(Java)

第一种快速排序算法:

/**
 * created by pc-fengc on 2018-06-06 09:31.
 *
 *Java 代码的快速排序算法
 * 快速排序的原理 :选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的,都放在右边(一般是无序的)。一般基准值选择序列的第一个元素。
 */
public class FastSorting {

    public static void main(String[] args) {
        int[] arr = {11,67,98,35,9,43,2,1,6,34,89,32,33,65,76,80,88,89};
        int start = 0;
        int end = arr.length - 1; //数组是从0下标开始的
        sort(arr,start,end);
        for (int a :arr) System.out.print(a + " ");
        System.out.println("");
    }

    public static void sort(int[] a, int low,int high) {
        int start = low;
        int end = high;
        int key = a[start];

        while (end > start) {
            /*从后往前比较大小,遇到比基数小,交换位置*/
            while (end > start && a[end] >= key) end -- ; //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
            if (a[end] < key) swapArr(a,start,end); //基数与比基数小的交换位置
            /*从前往后比较大小,遇见比基数大的,交换位置*/
            while (end > start && a[start] <= key) start ++; ///如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
            if (a[start] > key) swapArr(a,start,end);//基数与比基数大的交换位置
        } //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
        /*进行递归*/
        if (start > low) sort(a,low,start - 1);  /*左边的值都比基数小,所以递归比较基数左边的数组*/
        if (end < high) sort(a,end + 1,high);     /*右边的值都比此基数大,所以递归比较基数右边的数组*/
    }
    //数组中两个位置交换
    private static void swapArr(int[] a,int start,int end){
        int temp = a[start];
        a[start] = a[end];
        a[end] = temp;
    }

}

第二种:冒泡算法:

/**
 * created by pc-fengc on 2018-06-06 14:27.
 * 冒泡算法..........
 *冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
 * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成
 * 。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = getIntArr(100);
        System.out.println("输出之前的数组:");
        for (int a :arr) System.out.print(a + "\t");
        System.out.println("");
        System.out.println("输出冒泡排序后的数组:");
        sortBubble(arr);
        for (int a :arr) System.out.print(a + "\t");
        System.out.println("");

    }
    public static int[] getIntArr(int n) {
        int[] a = new int[n];
        for (int i = 0 ; i < n ; i++) {
            a[i] = (int)(Math.random() * 100);
        }
        return  a;
    }
    public static void sortBubble(int[] a) {

        int temp = 0;
        int size = a.length;
        for (int i = 0 ; i < size - 1 ; i ++) {
            for (int j = 0 ; j < size - 1 - i ; j++) {
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }
}

第三种:快速排序算法 使用二分法,返回基准值下标

/**
 * created by pc-fengc on 2018-06-06 11:23.
 */
public class FastSortMiddle {

    public static void main(String[] args) {
        int[] arr = getIntArr(50);
        sort(arr,0,arr.length - 1);
        for (int a : arr) System.out.print(a + " ");
        System.out.println("");

    }
    /**
     * 递归排序数组
     * @param a
     * @param start
     * @param end
     */
    public static void sort(int[] a,int start,int end) {

        if(start < end) {
            int middle = getMiddle(a,start,end);
            sort(a,start,middle - 1);
            sort(a,middle + 1,end);
        }
    }
    /**
     * 将数组的某一段元素进行划分,小的在左边,大的在右边
     * 返回划分的中间值
     * @param a
     * @param start
     * @param end
     * @return
     */
    private static int getMiddle(int[] a,int start,int end) {
        int key = a[start]; /*以第一个数字作为为基准值*/
        while (start < end) {   //start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
            while (start < end && a[end] >= key) end --;  /*从右边开始往左遍历,比基准数大的继续往前*/
            if (a[end] < key) {  //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
                swapArr(a,start,end);
                start ++;  //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
            }
            while (start < end && a[start] <= key) start ++;
            if (a[start] > key) {   //上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
                swapArr(a,start,end);
                end --;
            }
        }
        //这里返回start或者end皆可,此时的start和end都为基准值所在的位置  
        return end; 
    }
    /**
     * 得到一串每个数字小于100的数组
     * @param n 代表数组多少个
     * @return
     */
    public static int[] getIntArr(int n) {
        int[] a = new int[n];
        for (int i = 0 ; i < n ; i++) {
            a[i] = (int)(Math.random() * 100);
        }
        return  a;
    }
    /**
     * 数组中两个不同的下表数字交换位置
     * @param a
     * @param start
     * @param end
     */
    private static void swapArr(int[] a,int start,int end) {
        int temp = a[start];
        a[start] = a[end];
        a[end] = temp;

    }
}

点赞