欢迎访问宙启技术站
智能推送

Java中对数组排序的方法

发布时间:2023-06-13 21:47:22

Java中有很多种对数组排序的方法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序等。这些排序算法的实现原理有所不同,但都可以对数组进行排序。下面介绍一些常用的排序算法及其实现方法。

1. 冒泡排序

冒泡排序是一种简单的排序算法,它每次比较相邻的两个元素,如果顺序不正确就将它们交换,并且每次往后移动一位,直到所有元素都排序完成。具体实现如下:

public static void bubbleSort(int[] arr) {
    int len = arr.length;
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

2. 选择排序

选择排序也很简单,它每次在未排序序列中选择最小元素,并将其放到已排序序列的末尾。具体实现如下:

public static void selectionSort(int[] arr) {
    int len = arr.length;
    for (int i = 0; i < len - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex])
                minIndex = j;
        }
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

3. 插入排序

插入排序就像是扑克牌排序一样,把未排序的数据插入到已排序的序列中,并依次比较和移动元素。具体实现如下:

public static void insertionSort(int[] arr) {
    int len = arr.length;
    for (int i = 1; i < len; i++) {
        int j = i - 1;
        int temp = arr[i];
        while (j >= 0 && arr[j] > temp) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = temp;
    }
}

4. 归并排序

归并排序是一种分治思想的排序算法,它将未排序的数组分成两部分,再对每一部分进行递归排序,最后将两部分合并起来。具体实现如下:

public static void mergeSort(int[] arr, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (int p = 0; p < temp.length; p++) {
        arr[left + p] = temp[p];
    }
}

5. 快速排序

快速排序也是一种分治思想的排序算法,它选取一个元素作为基准,将小于基准的元素放到左边,大于基准的元素放到右边,递归处理左右两部分。具体实现如下:

public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
        int pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left, j = right;
    while (i < j) {
        while (i < j && arr[j] >= pivot) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = pivot;
    return i;
}

6. 堆排序

堆排序主要通过将一个无序序列构建成一个堆,然后每次取出堆顶元素,直到堆为空。具体实现如下:

public static void heapSort(int[] arr) {
    int len = arr.length;
    // 构建大顶堆
    for (int i = len / 2 - 1; i >= 0; i--) {
        adjustHeap(arr, i, len);
    }
    // 每次取出堆顶元素
    for (int i = len - 1; i > 0; i--) {
        swap(arr, 0, i);
        adjustHeap(arr, 0, i);
    }
}

public static void adjustHeap(int[] arr, int i, int len) {
    int temp = arr[i];
    for (int j = 2 * i + 1; j < len; j = 2 * j + 1) {
        if (j + 1 < len && arr[j] < arr[j + 1])
            j++;
        if (arr[j] > temp) {
            arr[i] = arr[j];
            i = j;
        } else {
            break;
        }
    }
    arr[i] = temp;
}

以上就是对数组排序的一些常用方法,不同的排序算法在效率和空间上都有不同的权衡。在实际应用中,应根据数据的特点选择最合适的排序方法。