十种排序算法及其比较(java实现)

图1 十大排序算法(参考自[[K_天道酬勤的CSDN博客](http://blog.csdn.net/qq_21688757/article/details/53749198)])

快速排序

public static int[] QuickSort(int[] array) {
    int[] value = new int[array.length];
    System.arraycopy(array, 0, value, 0, array.length);
    QuickSortRecursive(value, 0, value.length - 1);
    return value;
}

private static void QuickSortRecursive(int[] value, int start, int end) {
    if (start >= end)
        return;
    int mid = value[end];
    int left = start, right = end - 1;
    while (left < right) {
        while (value[left] <= mid && left < right)
            left++;
        while (value[right] >= mid && left < right)
            right--;
        swap(value, left, right);
    }
    if (value[left] >= mid)
        swap(value, left, end);
    else
        left++;
    QuickSortRecursive(value, start, left - 1);
    QuickSortRecursive(value, left + 1, end);
}

Q1:为什么是从右边开始,寻找第一个比枢纽小的数,而不是从左边开始,寻找第一个比枢纽大的数?
如果从左边开始,寻找第一个比枢纽大的数,无法进行枢纽判断。

归并排序

public static int[] MergeSort(int[] arr) {
    int len = arr.length;
    int[] value = new int[len], temp = new int[len];
    System.arraycopy(arr, 0, value, 0, len);
    MergeSortRecursive(value, temp, 0, len - 1);
    return value;
}

private static void MergeSortRecursive(int[] value, int[] temp, int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = start + (len >> 1);
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    MergeSortRecursive(value, temp, start1, end1);
    MergeSortRecursive(value, temp, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2)
        temp[k++] = value[start1] <= value[start2] ? value[start1++] : value[start2++];
    while (start1 <= end1)
        temp[k++] = value[start1++];
    while (start2 <= end2)
        temp[k++] = value[start2++];
    for (k = start; k <= end; k++)
        value[k] = temp[k];
}

堆排序

private static int[] HeapSort(int[] arr) {
    int length = arr.length;
    int[] value = new int[length];
    System.arraycopy(arr, 0, value, 0, length);
    int len = length - 1, beginIndex = len >> 1, k;
    for (k = beginIndex; k >= 0; k--)
        HeapMax(value, k, len);
    for (k = len; k > 0; k--) {
        swap(value, k, 0);
        HeapMax(value, 0, k - 1);
    }
    return value;
}

private static void HeapMax(int[] value, int index, int len) {
    int lIndex = (index << 1) + 1, rIndex = lIndex + 1, mIndex = lIndex;
    if (lIndex > len)
        return;
    if (rIndex <= len && value[lIndex] < value[rIndex])
        mIndex = rIndex;
    if (value[mIndex] > value[index]) {
        swap(value, mIndex, index);
        HeapMax(value, mIndex, len);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,375评论 0 1
  • 前言 本篇文章基本是从常用排序算法总结(一)快速排序引申而来,其中大部分代码和描述都来自这两篇文章。 时间复杂度 ...
    王三的猫阿德阅读 1,123评论 0 1
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 12,277评论 6 19
  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素记录,按其关键字...
    kevin16929阅读 577评论 0 0
  • 周六早上七点半的闹钟,没有赖床直接跳起来,匆匆洗漱完毕。穿上昨晚挑了好久才选定的V领无袖小黑裙,虽然拜拜肉还在抗...
    阑珊记阅读 311评论 2 1