排序算法-Java实现

冒泡排序

public void sort(int[] array) {
    for (int i = array.length - 1; i > 0; i--) {
        boolean swapped = false;
        for (int j = 0; j + 1 <= i; j++) {
            if (array[j] > array[j + 1]) {
                swap(array, j, j + 1);
                swapped = true;
            }
        }
        if (!swapped) {
            // 本轮没有替换, 提前结束
            break;
        }
    }
}

选择排序

    public void sort(int[] array) {
        int len = array.length;
        for (int i = 0; i < len - 1; i++) {
            // 初始化最小值索引
            int min = i;

            for (int j = i + 1; j < len; j++) {
                if(array[min] < array[j]) {
                    min = j;
                }
            }

            // 最小值索引已更改, 交换
            if(min != i) {
                swap(array, i, min);
            }
        }
    }

插入排序

public void sort(int[] array) {
    for (int i = 1; i < array.length; i++) {
        int k = array[i];
        while (i - 1 >= 0 && array[i - 1] > k) {
            array[i] = array[i - 1];
            i--;
        }
        array[i] = k;
    }
}

快速排序

public void sort(int[] array) {
    doSort(array, 0, array.length - 1);
}

private void doSort(int[] array, int left, int right) {
    if (left >= right) return;

    int i = left - 1, j = right + 1, mid = array[left + right >> 1];

    while (i < j) {
        do i ++; while (array[i] < mid);
        do j --; while (array[j] > mid);
        if(i < j) swap(array, i, j);
    }

    doSort(array, left, j);
    doSort(array, j + 1, right);
}

归并排序

public void sort(int[] array) {
        doSort(array, 0, array.length - 1);
    }

    private void doSort(int[] array, int left, int right) {
        if (left >= right) return;

        int mid = left + right >> 1;
        doSort(array, left, mid);
        doSort(array, mid + 1, right);

        int i = left, j = mid + 1, k = 0;
        int[] tmp = new int[right - left + 1];
        while (i <= mid && j <= right) {
            if (array[i] < array[j]) tmp[k++] = array[i++];
            else tmp[k++] = array[j++];
        }

        while (i <= mid) tmp[k++] = array[i++];
        while (j <= right) tmp[k++] = array[j++];

        for (i = left, j = 0; i <= right; i++, j++) array[i] = tmp[j];
        // System.arraycopy(tmp, 0, array, left, right - left + 1);
    }

堆排序

public void sort(int[] arr, int n) {
    int size = n;
    for (int i = 1; i <= size; i++) {
        push_up(arr, i);
    }
    for (int i = 1; i <= n; i++) {
        swap(arr, 1, size);
        size--;
        push_down(arr, size, 1);
    }
}

private void push_down(int[] arr, int size, int u) {
    int t = u, left = u * 2, right = u * 2 + 1;
    if (left <= size && arr[left] > arr[t]) t = left;
    if (right <= size && arr[right] > arr[t]) t = right;
    if (u != t) {
        swap(arr, u, t);
        push_down(arr, size, t);
    }
}

private void push_up(int[] arr, int u) {
    while (u / 2 > 0 && arr[u / 2] < arr[u]) {
        swap(arr, u / 2, u);
        u /= 2;
    }
}

原文地址:排序算法-Java实现
源码地址:AlgorithmsInJava

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值