Java数据结构的十大排序

Java数据结构的十大排序攻略

简介

在计算机科学中,排序算法是一种将一串数据按照特定顺序进行排列的方法,其中常见的排序算法有很多种,不同的算法适用于不同的数据类型和数据规模。Java是一种常见的编程语言,也提供了很多实现排序算法的类和方法。

本文将介绍Java数据结构的十大排序算法,分别为:插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、堆排序、计数排序、桶排序和基数排序。并针对每种排序算法进行详细的讲解,介绍算法思路、实现方式、时间复杂度等相关内容。

1. 插入排序(Insertion Sort)

插入排序是一种简单的排序算法,其基本思想是将待排序的元素按照大小依次插入已经有序的序列中。插入排序方法有两种:直接插入排序和希尔排序。

1.1 直接插入排序

直接插入排序的思路是将无序数据插入到已经有序的序列中,从而形成一个更大的有序序列。

以下是Java中直接插入排序的代码示例:

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

1.2 希尔排序

希尔排序是直接插入排序的一种改进算法,它通过比较距离较远(增量较大)的元素进行排序,使得元素可以快速地到达它们的最终位置。

以下是Java中希尔排序的代码实现示例:

public static void shellSort(int[] arr) {
    int n = arr.length;
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j = i;
            while (j >= gap && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
    }
}

2. 选择排序(Selection Sort)

选择排序是一种简单的排序算法,其基本思想是通过比较选出最小的元素,然后将它与第一个位置的元素进行交换,接着在剩下的元素中继续寻找最小的元素,重复这个过程直至排序完成。

以下是Java中选择排序的代码实现示例:

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

3. 冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,其基本思想是不断比较相邻的元素,将大的元素向右移动,小的元素向左移动,从而实现排序。

以下是Java中冒泡排序的代码实现示例:

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n; i++) {
        boolean flag = false;
        for (int j = 1; j < n - i; j++) {
            if (arr[j - 1] > arr[j]) {
                int temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
                flag = true;
            }
        }
        if (!flag) {
            break;
        }
    }
}

4. 快速排序(Quick Sort)

快速排序是一种常见的排序算法,其基本思想是通过分治的思想将待排序的序列分成两个子序列,其中一个子序列的
所有元素都比另一个子序列的所有元素小,然后递归地对两个子序列进行排序。

以下是Java中快速排序的代码实现示例:

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

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

5. 归并排序(Merge Sort)

归并排序是一种常见的排序算法,其基本思想是将待排序的序列分成若干个子序列,然后对每个子序列递归地进行排序,最后将各个有序子序列合并成一个有序序列。

以下是Java中归并排序的代码实现示例:

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);
    }
}

private static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left;
    int j = mid + 1;
    int 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++];
    }
    System.arraycopy(temp, 0, arr, left, temp.length);
}

6. 堆排序(Heap Sort)

堆排序是一种常见的排序算法,其基本思想是将待排序的序列构造成一个大根堆或小根堆,然后将堆顶元素与堆底元素进行交换,接着重新调整堆,如此往复直至排序完成。

以下是Java中堆排序的代码实现示例:

public static void heapSort(int[] arr) {
    int n = arr.length;
    for (int i = n / 2 - 1; i >= 0; i--) {
        adjustHeap(arr, i, n);
    }
    for (int i = n - 1; i >= 0; i--) {
        int temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
        adjustHeap(arr, 0, i);
    }
}

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

7. 计数排序(Counting Sort)

计数排序是一种非比较排序算法,其基本思想是通过统计待排序数据中小于每个元素的个数,来确定该元素的位置,从而得到排序结果。

以下是Java中计数排序的代码实现示例:

public static void countingSort(int[] arr) {
    int n = arr.length;
    if (n <= 1) {
        return;
    }
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < n; i++) {
        max = Math.max(max, arr[i]);
    }
    int[] count = new int[max + 1];
    for (int i = 0; i < n; i++) {
        count[arr[i]]++;
    }
    for (int i = 1; i <= max; i++) {
        count[i] += count[i - 1];
    }
    int[] temp = new int[n];
    for (int i = n - 1; i >= 0; i--) {
        int index = count[arr[i]] - 1;
        temp[index] = arr[i];
        count[arr[i]]--;
    }
    System.arraycopy(temp, 0, arr, 0, n);
}

8. 桶排序(Bucket Sort)

桶排序是一种非比较排序算法,其基本思想是将待排序的序列分成若干个桶,然后对每个桶单独进行排序,最终将所有桶中的元素有序地合并成一个序列。

以下是Java中桶排序的代码实现示例:

public static void bucketSort(int[] arr) {
    int n = arr.length;
    if (n <= 1) {
        return;
    }
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < n; i++) {
        max = Math.max(max, arr[i]);
    }
    int bucketSize = 10;
    int bucketCount = (max - 1) / bucketSize + 1;
    List<List<Integer>> buckets = new ArrayList<>(bucketCount);
    for (int i = 0; i < bucketCount; i++) {
        buckets.add(new ArrayList<>());
    }
    for (int i = 0; i < n; i++) {
        int index = (arr[i] - 1) / bucketSize;
        buckets.get(index).add(arr[i]);
    }
    int cursor = 0;
    for (int i = 0; i < bucketCount; i++) {
        List<Integer> bucket = buckets.get(i);
        Collections.sort(bucket);
        for (Integer num : bucket) {
            arr[cursor++] = num;
        }
    }
}

9. 基数排序(Radix Sort)

基数排序是一种非比较排序算法,其基本思想是将待排序的数字按照权重依次排序,从低位到高位进行排序,最终得到一个有序序列。

以下是Java中基数排序的代码实现示例:

public static void radixSort(int[] arr) {
    int n = arr.length;
    if (n <= 1) {
        return;
    }
    int maxDigit = getMaxDigit(arr);
    int mod = 10;
    int div = 1;
    List<List<Integer>> buckets = new ArrayList<>(10);
    for (int i = 0; i < 10; i++) {
        buckets.add(new ArrayList<>());
    }
    for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
        for (int j = 0; j < n; j++) {
            int digit = (arr[j] % mod) / div;
            buckets.get(digit).add(arr[j]);
        }
        int cursor = 0;
        for (int j = 0; j < 10; j++) {
            List<Integer> bucket = buckets.get(j);
            for (Integer num : bucket) {
                arr[cursor++] = num;
            }
            bucket.clear();
        }
    }
}

private static int getMaxDigit(int[] arr) {
    int max = Integer.MIN_VALUE;
    for (int num : arr) {
        max = Math.max(max, num);
    }
    return max == 0 ? 1 : (int) Math.log10(max) + 1;
}

总结

本文介绍了Java数据结构的十大排序算法,这些算法在实际开发应用中都有很广泛的应用。根据不同的数据类型和数据规模,我们可以选择不同的排序算法来实现排序功能。熟练理解和掌握这些算法对于提升编程能力和解决实际问题都有很大的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构的十大排序 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构之算法的时间复杂度

    关于C语言数据结构之算法的时间复杂度,需要先了解一些基本概念。 什么是时间复杂度 时间复杂度是算法的一种衡量标准,用于评估算法的执行效率。表示代码执行的时间和数据量之间的关系,通常用大O符号来表示,称为“大O记法”。 时间复杂度的分类 时间复杂度可分为以下几类: 常数阶:O(1) 对数阶:O(log n) 线性阶:O(n) 线性对数阶:O(n log n) …

    数据结构 2023年5月17日
    00
  • C++二叉树结构的建立与基本操作

    C++二叉树是一种非常常见的数据结构,同时也是算法中经常使用的一种数据结构。本文将详细讲解C++二叉树的建立和基本操作,包括二叉树的定义、创建、遍历和删除等。 1. 二叉树的定义 二叉树是一种树形结构,每个节点最多只有两个子节点:左子节点和右子节点。树的深度取决于有多少个节点,根节点是最顶端的节点,不再有父节点。节点之间存在一些有天然排序关系且有先后性的关系…

    数据结构 2023年5月17日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • c语言数据结构之并查集 总结

    C语言数据结构之并查集总结 简介 并查集,也称作不相交集合,是一种树型的数据结构。并查集用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 并查集只有两个操作: find:确定某个元素属于哪个子集。它可以被用来确定两个元素是否属于同一子集。 union:将两个子集合并成同一个集合。 基本实现 以快速查找find和…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图设计与实现详解

    Java数据结构之有向图设计与实现详解 什么是有向图 有向图是一种图形结构,其中每一个节点都有一个方向,即它指向或被其他节点指向。有向图可以用来表示许多实际问题,如路线、依赖关系、状态转移等。 有向图的基本概念 在有向图中,每一个节点都有一个唯一的标识符,被称为节点ID。如果从节点A到节点B存在一条有向边,则称B是A的后继节点,A是B的前驱节点。节点的度数是…

    数据结构 2023年5月17日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之线段树

    C++高级数据结构之线段树攻略 什么是线段树 线段树是一种数据结构,它可以支持区间查询和单点修改,是处理静态区间问题的常用手段。它利用了 二分思想,将区间离散化成一些个体,然后考虑对个体进行处理,再结合区间合并的特性,更新区间信息。线段树主要由四个操作构成:建树、单点修改、区间查询和区间修改。 线段树的数据表示 在实现线段树时,我们需要考虑数据结构的几个要素…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部