JAVA 九大排序算法

1、冒泡排序

public class Bobble {
    private static void sort(int[] arrays) {
        //一次性读取到高速缓存中,避免cache miss
        int length =  arrays.length;
        for (int i = 1; i < length; i++) {
            for (int j = 0; j < length-i ; j++) {
                if (!less(arrays[j], arrays[j+1])) {
                    cmpxchg(arrays, j, j+1);
                }
            }
        }
    }
//交换数据
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }
//i是否小于j
    private static boolean less(int i, int j) {
        return i < j;
    }
//测试
    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

2、选择排序

public class Select {
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }
//i是否小于j
    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        //每次找出最小值与第一个位置交换
        int length = arrays.length;
        for (int i = 0; i < length-1 ; i++) {
            int minIndex = i;
            for (int j = i+1; j < length ; j++) {
                //每次比较O(n)
                if (!less(arrays[minIndex], arrays[j])) {
                    minIndex = j;
                }
            }
            //跟当前位置交换
            cmpxchg(arrays, minIndex, i);
        }

        //时间复杂度 O(n) + O(n^2) = O(n^2)
        //空间复杂度O(n)
    }

    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

3、插入排序

public class Insert {


    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        int length = arrays.length;
        for (int i = 1; i < length ; i++) {
            //每次都执行O(n)次for
            for (int j = i; j > 0 ; j--) {
                //每次都比较O(n)次
                if (less(arrays[j-1], arrays[j])) {
                    break;
                }
                //每次都交换O(n)次
                cmpxchg(arrays, j, j-1);
            }
        }
        //时间复杂度位O(n^2)
    }

    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

4、希维尔排序

public class Shell {
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        int h = 1;
        while (h < arrays.length >> 1)
            h = 2 * h + 1;

        while (h > 0) {
            for (int i = h ; i < arrays.length ; i++) {
                for (int j = i; j > h-1 ; j-=h) {
                    //h==1时就是插入排序
                    if (less(arrays[j], arrays[j - h])) {
                        cmpxchg(arrays, j, j - h);
                    }
                }
            }
            h >>= 1;
        }
    }

    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

5、计数排序

public class Count {
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        //适用于0~9
        int length = arrays.length;
        int max = arrays[0];
        //时间复杂度 O(n)
        for (int i = 1; i < length ; i++) {
            if (less(max, arrays[i])) {
                max = arrays[i];
            }
        }

        //时间复杂度 O(n)
        int[] tempArrays = new int[max+1];
        for (int i = 0; i < length ; i++) {
            tempArrays[arrays[i]]++;
        }

        int index = 0;
        //时间复杂度 O(n)
        for (int i = 0; i < tempArrays.length ; i++) {
            if (tempArrays[i]-- > 0) {
                arrays[index++] = i;
            }
        }

        //总时间复杂度 O(n) + O(n) + O(n) = 3O(n) = O(n)
    }

    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

6、基数排序

public class Buckets {

    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {

        int length = arrays.length;
        List<List<Integer>> temp = new ArrayList(10);
        for (int i = 0; i < 10 ; i++) {
            temp.add(new ArrayList<>());
        }

        //要找出最大值
        int max = arrays[0];
        //时间复杂度 O(n)
        for (int i = 1; i < length ; i++) {
            if (less(max, arrays[i])) {
                max = arrays[i];
            }
        }
        //
        int len = String.valueOf(max).length();
        //取余,取整
        int balance = 10, adjustment = 1;
        while (len > 0) {
            for (int i = 0; i < length ; i++) {
                int index = arrays[i] % balance / adjustment;
                temp.get(index).add(arrays[i]);
            }
            //第一轮完毕,取出数据
            int index = 0;
            for (List<Integer> list : temp) {
                if (list != null) {
                    for (int i = 0; i < list.size(); i++) {
                        arrays[index++] = list.remove(i--);
                    }
                }
            }
            //
            balance*=10;
            adjustment*=10;
            len--;
        }



    }

    public static void main(String[] args) {
        int[] a = {61,55,43,38,25,14};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

7、归并排序

public class Merge {

    private static int[] temp = new int[6];
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {
        return i < j;
    }

    private static void sort(int[] arrays) {
        //每次找出最小值与第一个位置交换
        sort(arrays, 0, arrays.length-1);
    }

    private static void sort(int[] arrays, int i, int j) {
        if (j <= i) {
            return;
        }
        int start = i;
        int end = j;
        int tempMid = start + ((end-start) >> 1);
        sort(arrays, start, tempMid);
        sort(arrays, tempMid + 1, end);
        merge(arrays, start, end, tempMid);
    }

    private static void merge(int[] arrays, int i, int j, int mid) {
        //这里不能从0开始
        int index = i;

        int left = i, right = mid + 1;
        for (; left < right &&  right <= j; ) {
            if(less(arrays[left], arrays[right])) {
                temp[index++] = arrays[left++];
            } else {
                temp[index++] = arrays[right++];
            }
        }

        //判断左边是否已经遍历完毕
        while (left <= mid) {
            temp[index++] = arrays[left++];
        }

        //判断右边是否已经遍历完毕
        while (right <= j) {
            temp[index++] = arrays[right++];
        }

        for (int k = i; k <= j ; k++) {
           arrays[k] = temp[k];
        }

    }


    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

8、堆排序

public class Head {
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        buildMaxHead(arrays);
        int length = arrays.length;
        for (int i = length - 1 ; i > 0 ; ) {
            //每次都与最后一个交换
            cmpxchg(arrays, 0, i);
            i--;
            //开始下沉
            int k = 0;
            while (k <= i) {
                int left = (k << 1) + 1;
                if (left > i) {
                    break;
                }
                int value = arrays[left];
                int right = left + 1;
                if (right <= i && less(value, arrays[right])) {
                    value = arrays[left = right];
                }
                if (less(arrays[k], value)) {
                    cmpxchg(arrays, k, left);
                }
                k = left;
            }
        }

    }

    private static void buildMaxHead(int[] arrays) {
        int length = (arrays.length - 1) >>> 1;
        for (int i = length; i >= 0; i--) {
            int k = i;
            while (k <= length) {
                int left = (k << 1) + 1;
                int value = arrays[left];
                 int right = left + 1;
                 if (right < arrays.length && less(value, arrays[right])) {
                     value = arrays[left=right];
                 }
                 if (less(arrays[k], value)) {
                     cmpxchg(arrays, k, left);
                 }
                 k = left;
             }
        }
    }



    public static void main(String[] args) {
        int[] a = {8,7,6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}

9、快速排序

public class Quick {
    private static void cmpxchg(int[] arrays, int i, int j) {
        int array = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = array;
    }

    private static boolean less(int i, int j) {

        return i < j;
    }

    private static void sort(int[] arrays) {
        //每次找出最小值与第一个位置交换
        sort(arrays, 0, arrays.length-1);
    }


    private static void sort(int[] arrays, int low, int high) {

        if (low >= high) {
            return;
        }
        int position = position(arrays, low, high);

        sort(arrays, low, position-1);
        sort(arrays, position+1, high);

    }

    private static int position(int[] arrays, int low, int high) {
        int left = low, right = high + 1;
        int comparable = arrays[low];

        while (true) {
            while (less(comparable, arrays[--right])) {
                if (low == right) {
                    break;
                }
            }
            //从左往右扫描
            while (!less(comparable, arrays[++left])) {
                if (left == right) {
                    break;
                }
            }
            if (left >= right) {
                cmpxchg(arrays, low, right);
                break;
            } else {
                cmpxchg(arrays, left, right);

            }
        }
        return right;
    }

    public static void main(String[] args) {
        int[] a = {6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值