Java必备-冒泡排序,选择排序,快速排序(纯代码实现)


冒泡排序: 

 

import java.util.Arrays;

/**
 * 是将无序a[0],a[1]...a[n],将其升序排序,比较a[0].a[1]的值,若结果为1,则交换两者的值,否则不变,接着继续向下比较.最后比较a[n-1].a[n]的结果,结束后,a[n]的值为当前数组中最大值.接着继续将a[1]~a[n-1]进行比较.一共处理n-1轮后, 就是以升序排列
 *
 * 优点: 稳定
 * 缺点: 耗时长,每次只是移动两个相邻的数据做对比
 * @Description Java冒泡排序
 * @Author : Dy yimting@yeah.net
 * @Date : 2019/3/26,14:06
 * @Project : Java_Sort
 * @Version : 1.0
 **/
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {34, 2, 146, 76, 45, 3, 6, 7};
        long start = System.nanoTime();
        sort(arr);
        long end = System.nanoTime();
        System.out.println("排序后 : " + Arrays.toString(arr));
        System.out.println("运行时间:" + (end - start) + " ns");
    }

    /**
     * @param arr 传入的数组
     *            第一次外层循环 ,和第一层内层循环内部结果
     *            34 2 146 76 45 3 6 7
     *            2 34 146 76 45 3 6 7
     *            2 34 146 76 45 3 6 7
     *            2 34 76 146 45 3 6 7
     *            2 34 76 45 146 3 6 7
     *            2 34 76 45 3 146 6 7
     *            2 34 76 45 3 6 146 7
     *            2 34 76 45 3 6 7 146
     *            .....................
     */
    public static void sort(int[] arr) {
        //外侧循环控制整个循环的次数
        for (int i = 0; i < arr.length - 1; i++) {
            // 内侧循环对比两个值
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //如果第一个值比第二个值大
                //第一个值就与第二个值进行交换
                if (arr[j] > arr[j + 1]) {
                    arr[j] = arr[j] ^ arr[j + 1];
                    arr[j + 1] = arr[j] ^ arr[j + 1];
                    arr[j] = arr[j] ^ arr[j + 1];
                }
            }
        }
    }
}

 

 

 

选择排序 : 

 

import java.util.Arrays;

/**
 * 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作。
 * 选择排序是不稳定的排序方法
 *
 * @Description Java选择排序
 * @Author : Dy yimting@yeah.net
 * @Date : 2019/3/26,14:47
 * @Project : bigdata
 * @Version : 1.0
 **/
public class SelectSort {
    public static void main(String[] args) {
        int[] arr = {34, 2, 146, 76, 45, 3, 6, 7, 6, 6};
        long start = System.nanoTime();
        sort(arr);
        long end = System.nanoTime();
        System.out.println("排序后 : " + Arrays.toString(arr));
        System.out.println("运行时间:" + (end - start) + " ns");
    }

    public static void sort(int[] arr) {
        //第一轮循环
        for (int i = 0; i < arr.length - 1; i++) {
            int small = i;
            //取出数组中的最小值
            for (int j = small + 1; j < arr.length; j++) {
                //判断循环到的值进行对比, 取出最小值的下标
                if (arr[small] > arr[j]) {
                    small = j;
                }
            }
            //最小值与循环到的值的位置进行交换
            if (i != small) {
                arr[small] = arr[small] ^ arr[i];
                arr[i] = arr[small] ^ arr[i];
                arr[small] = arr[small] ^ arr[i];
            }
        }
    }
}

 

 

快速排序 : 

 

import java.util.Arrays;

/**
 * @Description 经典快排: 拿出一个值作为基准值, 与基准值做比较
 * @Author : Dy yimting@yeah.net
 * @Date : 2019-03-08 10:01:48
 * @Project : Java_Sort
 * @Version : 1.0
 **/
public class QuickSort {
    public static void main(String[] args) {

        int[] arr = {12, 4, 2, 5, 79, 6, 6, 6};

        long start = System.nanoTime();
        sort(arr, 0, arr.length - 1);
        System.out.println("排序结果 :" + Arrays.toString(arr));
        long end = System.nanoTime();

        System.out.println("运行时间:" + (end - start) / 100000 + " ms");
    }

    /**
     * 对arr[first] - arr[last] 进行排序
     *
     * @param arr   需要排序的数组
     * @param first 数组中的起始值
     * @param last  数组中的最后
     */
    private static void sort(int[] arr, int first, int last) {
        //判断下标是否存在有问题
        if (first >= last) {
            return;
        }
        //赋予变量, 接收,便于更改
        int i = first;
        int j = last;
        while (i < j) {
            //取出第一个元素作为基准值
            int one = arr[i];
            /*-----------右侧的轮询------------*/
            //如果 最后一个值大于等于基准值 或者 i坐标 小于 j坐标 (防止坐标冲突)
            while (arr[j] >= one && i < j) {
                //如果满足条件的话, 需要将指针,向左移动
                j--;
            }
            //进行交换
            swap(arr, i, j);
            /*-----------左侧的轮询------------*/
            //如果 第一个值 小于等于基准值或者 i坐标 小于 j坐标 (防止坐标冲突)
            while (arr[i] <= one && i < j) {
                //如果满足条件的话, 需要将指针,向右移动
                i++;
            }
            //进行交换
            swap(arr, i, j);
        }

        /*-----------进行递归操作------------*/
        //对于基准左侧的集合 重复操作
        sort(arr, first, i - 1);
        //对于基准右侧的集合 重复操作
        sort(arr, i + 1, last);
    }

    /**
     * 单独提出一个方法用来进行数值的交换
     * 这个方式会使运行速度降低
     *
     * @param arr 调用方法时需要进行交换的数组
     * @param i   坐标
     * @param j   坐标
     */
    static void swap(int[] arr, int i, int j) {
        if (i < j) {
            arr[i] = arr[i] ^ arr[j];
            arr[j] = arr[i] ^ arr[j];
            arr[i] = arr[i] ^ arr[j];
        }
    }

}

 

posted @ 2019-03-26 15:27  Is_Baki  阅读(845)  评论(0编辑  收藏  举报