排序算法 实现 比较

2018-12-02  本文已影响0人  Boger_8cf1

public class Main {
public static void main(String[] args) {
int[] arr = new int[1000000];
// new Thread(new Runnable() {
// @Override
// public void run() {
// // 冒泡排序
// for (int i = 0; i < 100000; i++) {
// arr[i] = (int) (Math.random() * 100000);
// }
// long start = System.currentTimeMillis();
// bubbleSort(arr);
// long end = System.currentTimeMillis();
// System.out.println("冒泡排序耗时:" + (end - start) + "ms");
// System.out.println();
// }
// }).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// //选择排序
// for (int i = 0; i < 100000; i++) {
// arr[i] = (int) (Math.random() * 100000);
// }
// long start = System.currentTimeMillis();
// insertSort(arr);
// long end = System.currentTimeMillis();
// System.out.println("插入排序耗时:" + (end - start) + "ms");
// System.out.println();
// }
// }).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// for (int i = 0; i < 100000; i++) {
// arr[i] = (int) (Math.random() * 100000);
// }
// long start = System.currentTimeMillis();
// checkSort(arr);
// long end = System.currentTimeMillis();
// System.out.println("选择排序耗时:" + (end - start) + "ms");
// }
// }).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000; i++) {
arr[i] = (int) (Math.random() * 1000000);
}
long start = System.currentTimeMillis();
mergeIntoSort(arr, 0, arr.length - 1);
long end = System.currentTimeMillis();
System.out.println("归并排序耗时:" + (end - start) + "ms");
System.out.println();
}
}).start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 1000000; i++) {
                arr[i] = (int) (Math.random() * 1000000);
            }
            long start = System.currentTimeMillis();
            quickSort(arr, 0, arr.length - 1);
            long end = System.currentTimeMillis();
            System.out.println("快速排序耗时:" + (end - start) + "ms");
            System.out.println();
        }
    }).start();
}

/**
 * 冒泡排序
 *
 * @param arr
 */
public static void bubbleSort(int[] arr) {
    int length = arr.length;
    for (int i = 0; i < length; i++) {
        boolean isOver = false;
        for (int j = 0; j < length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
                isOver = true;
            }
        }
        if (!isOver) {
            break;
        }
    }
}

/**
 * 插入排序
 *
 * @param arr
 */
public static void insertSort(int[] arr) {
    for (int i = 1; i < arr.length; ++i) {
        int j = i - 1;
        int value = arr[i];
        for (; j >= 0; --j) {
            if (arr[j] > value) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j + 1] = value;
    }

}

/**
 * 选择排序
 *
 * @param arr
 */
public static void checkSort(int[] arr) {
    int index = -1;
    for (int i = 0; i < arr.length; i++) {
        int min = Integer.MAX_VALUE;
        for (int j = i; j < arr.length; j++) {
            if (arr[j] < min) {
                min = arr[j];
                index = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
        swap(arr, i, index);
    }
}

/**
 * 归并排序
 *
 * @param arr
 */
public static void mergeIntoSort(int[] arr, int start, int end) {
    if (start == end) {
        return;
    }
    int mid = start + (end - start) / 2;
    mergeIntoSort(arr, start, mid);
    mergeIntoSort(arr, mid + 1, end);
    merge(arr, start, mid, end);
}

private static void merge(int[] arr, int start, int mid, int end) {
    int[] help = new int[end - start + 1];
    int index = 0;
    int startIndex = start;
    int midIndex = mid + 1;
    while (startIndex <= mid && midIndex <= end) {
        help[index++] = arr[startIndex] < arr[midIndex] ? arr[startIndex++] : arr[midIndex++];
    }
    while (startIndex <= mid) {
        help[index++] = arr[startIndex++];
    }
    while (midIndex <= end) {
        help[index++] = arr[midIndex++];
    }
    for (int i = 0; i < index; i++) {
        arr[start + i] = help[i];
    }
}


/**
 * 快速排序
 *
 * @param arr
 */
public static void quickSort(int[] arr, int start, int end) {
    if (start < end) {
        swap(arr, start + (int) (Math.random() * (end - start + 1)), end);
        int[] p = partition(arr, start, end);
        quickSort(arr, start, p[0] - 1);
        quickSort(arr, p[1] + 1, end);
    }
}

private static int[] partition(int[] arr, int start, int end) {
    int less = start - 1;
    int more = end;
    while (start < more) {
        if (arr[start] < arr[end]) {
            swap(arr, ++less, start++);
        } else if (arr[start] > arr[end]) {
            swap(arr, --more, start);
        } else {
            start++;
        }
    }
    swap(arr, more, end);
    return new int[]{less + 1, more};
}

public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

}

10W条数据下,五种排序算法 执行时间


image.png
上一篇 下一篇

猜你喜欢

热点阅读