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日

相关文章

  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • C++实现数据结构的顺序表详解

    C++实现数据结构的顺序表详解 介绍 在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。 创建顺序表 顺序表可以使用数组来实现。下面的代码展示了如何创建…

    数据结构 2023年5月17日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • C#数据结构之堆栈(Stack)实例详解

    C#数据结构之堆栈(Stack)实例详解 在编程中,我们经常需要保存一些数据,这些数据可以根据其进入的先后顺序以及其他规则进行处理和访问。其中,堆栈(Stack)是一种简单但是非常有用的数据结构。本文将为大家详细讲解堆栈(Stack)的概念、用法以及C#中的实现方法。 堆栈(Stack)概述 堆栈(Stack)是一种后进先出(LIFO)的数据结构。也就是说,…

    数据结构 2023年5月17日
    00
  • C语言进阶数据的存储机制完整版

    C语言进阶数据的存储机制完整版攻略 1. 前言 C语言是一门高度可控的语言,其中其数据的存储机制是必须掌握的基础知识点。本文介绍了C语言数据存储的机制,包括变量在内存中的分配、指针的应用及结构体的组织等内容,旨在帮助读者掌握C语言中的数据存储机制。 2. 变量在内存中的分配 变量在内存中的分配既涉及到内存的分配可操作性,也涉及到相应的存储结构。 2.1. 变…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之栈与队列的详解

    Java深入了解数据结构之栈与队列的详解 1. 栈的概念 栈(Stack)是一种先进后出的数据结构,类似于一个箱子,新的物品只能放到箱子的顶部,旧的物品只能从箱子的顶部取出。栈通常有下面几个基本操作: push:将元素压入栈中,放在栈顶。 pop:将栈顶元素弹出,如果栈为空,则抛出异常。 peek:返回栈顶元素,但不将其弹出,如果栈为空,则抛出异常。 isE…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维

    DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eri…

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