博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Java来写常见的排序算法
阅读量:7122 次
发布时间:2019-06-28

本文共 4979 字,大约阅读时间需要 16 分钟。

/** * 各种排序算法 * * @author huwei * */public class Sort {    public static void main(String[] args) {        int[] a = { 60, 57, 89, 47, 57, 98, 45, 35, 73 };        Sort sort = new Sort();        sort.quickSort(a);        for (int i = 0; i < a.length; i++) {            System.out.print(" " + a[i] + " ");        }    }     /**     * 插入排序     *     * @param data     */    public void insertSort(int[] data) {        for (int i = 1; i < data.length; i++) {            for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {                swap(data, j, j - 1);            }        }    }     /**     * 冒泡排序     *     * @param data     */    public void bubbleSort(int[] data) {        for (int i = 0; i < data.length; i++) {            for (int j = data.length - 1; j > i; j--) {                if (data[j] < data[j - 1]) {                    swap(data, j, j - 1);                }            }        }     }     /**     * 选择排序     *     * @param data     */    public void selectSort(int[] data) {        for (int i = 0; i < data.length; i++) {            int lowIndex = i;            for (int j = data.length - 1; j > i; j--) {                if (data[j] < data[lowIndex]) {                    lowIndex = j;                }            }            swap(data, i, lowIndex);        }    }     /**     * shell排序     *     * @param data     */    public void shellSort(int[] data) {        for (int i = data.length / 2; i > 2; i /= 2) {            for (int j = 0; j < i; j++) {                insertSort(data, j, i);            }        }        insertSort(data, 0, 1);// 最后进行一次插入排序    }     private void insertSort(int[] data, int start, int inc) {        for (int i = start + inc; i < data.length; i += inc) {            for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {                swap(data, j, j - inc);            }        }    }     /**     * 快速排序 重点     *     * @param data     */    public void quickSort(int[] data) {        quickSort(data, 0, data.length - 1);    }     private void quickSort(int[] data, int i, int j) {        int pivotIndex = (i + j) / 2;        // swap        swap(data, pivotIndex, j);         int k = partition(data, i - 1, j, data[j]);        swap(data, k, j);        if ((k - i) > 1)            quickSort(data, i, k - 1);        if ((j - k) > 1)            quickSort(data, k + 1, j);     }     private int partition(int[] data, int l, int r, int pivot) {        do {            while (data[++l] < pivot)                ;            while ((r != 0) && data[--r] > pivot)                ;            swap(data, l, r);        } while (l < r);        swap(data, l, r);        return l;    }     /**     * 归并排序     *     * @param data     */    public void mergeSort(int[] data) {        int[] temp = new int[data.length];        mergeSort(data, temp, 0, data.length - 1);    }     private void mergeSort(int[] data, int[] temp, int l, int r) {        int mid = (l + r) / 2;        if (l == r)            return;        mergeSort(data, temp, l, mid);        mergeSort(data, temp, mid + 1, r);        for (int i = l; i <= r; i++) {            temp[i] = data[i];        }        int i1 = l;        int i2 = mid + 1;        for (int cur = l; cur <= r; cur++) {            if (i1 == mid + 1)                data[cur] = temp[i2++];            else if (i2 > r)                data[cur] = temp[i1++];            else if (temp[i1] < temp[i2])                data[cur] = temp[i1++];            else                data[cur] = temp[i2++];        }    }     /**     * 堆排序     *     * @param data     */    public void heapSort(int[] data) {        MaxHeap h = new MaxHeap();        h.init(data);        for (int i = 0; i < data.length; i++)            h.remove();        System.arraycopy(h.queue, 1, data, 0, data.length);    }     private static class MaxHeap {        void init(int[] data) {            this.queue = new int[data.length + 1];            for (int i = 0; i < data.length; i++) {                queue[++size] = data[i];                fixUp(size);            }        }         private int size = 0;         private int[] queue;     /*  public int get() {            return queue[1];        }*/         public void remove() {            swap(queue, 1, size--);            fixDown(1);        }         // fixdown        private void fixDown(int k) {            int j;            while ((j = k << 1) <= size) {                if (j < size && queue[j] < queue[j + 1])                    j++;                if (queue[k] > queue[j]) // 不用交换                    break;                swap(queue, j, k);                k = j;            }        }         private void fixUp(int k) {            while (k > 1) {                int j = k >> 1;                if (queue[j] > queue[k])                    break;                swap(queue, j, k);                k = j;            }        }     }     public static void swap(int[] data, int i, int j) {        int temp = data[i];        data[i] = data[j];        data[j] = temp;    }}

 

转载地址:http://hoxel.baihongyu.com/

你可能感兴趣的文章
APP定制开发的完整流程
查看>>
使用 xcworkspace 管理 iOS 工程
查看>>
#iframe系列问题#
查看>>
PHP设计模式
查看>>
聊聊flink TaskManager的managed memory
查看>>
oracle先排序再分页
查看>>
javascript 判断数据类型的几种方法
查看>>
前端进击的巨人(七):走进面向对象,原型与原型链,继承方式
查看>>
canvas 绘制贪吃蛇游戏
查看>>
时间复杂度与空间复杂度分析
查看>>
从Express到Nestjs,谈谈Nestjs的设计思想和使用方法
查看>>
Java的8中基本数据类型
查看>>
Android 原生app获取用户授权访问Autodesk云应用数据
查看>>
LeetCode 310. Minimum Height Trees
查看>>
《Java编程思想》读书笔记-对象导论
查看>>
计算机体系
查看>>
算法 - 时间复杂度
查看>>
如何截取视频片段 批量截取片段的方法
查看>>
OKR与Scrum如何强强联手
查看>>
dva中组件的懒加载
查看>>