5种排序算法

5种排序算法


冒泡排序

依次比较相数字,顺序错误就交换,直到没有相邻元素需要交换。

public static void main(String[] args) {
    Random random = new Random();
    int a[] = new int[10];
    // 初始化一个数组
    for (int i = 0; i < a.length; i++) {
        a[i] = random.nextInt(100);
        System.out.print(a[i] + "	");
    }
    
    for (int i = 0; i < a.length-1; i++) {
        for (int j = 0; j < a.length-i-1; j++) {
            if (a[j] > a[j+1]) {		// 相邻数字比较排序
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    System.out.println();
    for (int i = 0; i<a.length; i++) {
        System.out.print(a[i] + "	");
    }	
}

快速排序

​通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public void sort(int arr[], int start, int end) {
    if (start > end) {
        return ;
    }
    int i = start;
    int j = end;
    int key = arr[i]; // 基准位

    while (i < j) {
        while (i < j && arr[j] > key) {
            j--;
        }
        arr[i] = arr[j];
        while (i < j && arr[i] < key) {
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = key;
    sort(arr, start, i - 1);
    sort(arr, i+1, end);
}

选择排序

​ 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

for (int i = 0; i < a.length; i++) {
    for (int j = i + 1; j < a.length; j++) {
        if (a[j] < a[i]) {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

插入排序

​ 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。

for (int i= 0; i <a.length; i++) {
    for (int j = 0; j < i; j++) {
        if (a[i] < a[j]) {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

归并排序

​ 先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

public static int[] sort(int[] a, int low, int high) {
    int mid = (low + high) / 2;
    if (low < high) {
        sort(a, low, mid);
        sort(a, mid + 1, high);
        // 左右归并
        merge(a, low, mid, high);
    }
    return a;
}

public static void merge(int[] a, int low, int mid, int high) {
    int[] temp = new int[high - low + 1];
    int i = low;
    int j = mid + 1;
    int k = 0;
    // 把较小的数先移到新数组中
    while (i <= mid && j <= high) {
        if (a[i] < a[j]) {
            temp[k++] = a[i++];
        } else {
            temp[k++] = a[j++];
        }
    }
    // 把左边剩余的数移入数组
    while (i <= mid) {
        temp[k++] = a[i++];
    }
    // 把右边边剩余的数移入数组
    while (j <= high) {
        temp[k++] = a[j++];
    }
    // 把新数组中的数覆盖nums数组
    for (int x = 0; x < temp.length; x++) {
        a[x + low] = temp[x];
    }
}
原文地址:https://www.cnblogs.com/wuxie0ne/p/10672611.html