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数据结构之双链表详细示例分析的完整攻略。 双链表简介与定义 双链表是链表的一种,在链表中每一个节点都有一个指针域,指向下一个节点,这个指针域称为next指针;而在双链表中每一个节点也有两个指针域,一个指向前驱节点,另一个指向后继节点,即prev指针与next指针。由于双链表存在两个指针域,因此它支持双向遍历,无论是正向还是…

    数据结构 2023年5月17日
    00
  • 深入理解Objective-C中类的数据结构

    深入理解Objective-C中类的数据结构 在Objective-C中,类作为面向对象编程的基础,是必不可少的概念。理解Objective-C中类的数据结构,对于开发者理解iOS应用程序的底层原理,以及编写高质量代码具有重要的意义。 类的数据结构 一个Objective-C类由以下几部分组成: isa指针:指向该类对象的元类,元类是描述一个类的对象。isa…

    数据结构 2023年5月17日
    00
  • C#中的数据结构介绍

    C#中的数据结构介绍 什么是数据结构? 数据结构是数据的组织、存储和管理方式。在计算机科学中,数据结构是指数据的组织形态。 C# 中常见的数据结构 在 C#中,常用的数据结构有以下几种。 1. 数组 数组是一种存储固定大小的相同类型元素的顺序集合。在 C# 中数组可以是单维、多维或交错的,并且数组支持索引和 LINQ 查询操作。在创建数组时需要指定数组的大小…

    数据结构 2023年5月17日
    00
  • 详解C语言实现空间索引四叉树

    详解C语言实现空间索引四叉树攻略 四叉树是一种常见的空间索引方法,可以有效地处理二维或三维空间中的数据。本攻略将详细介绍使用C语言实现空间索引四叉树的方法,包括数据结构的设计,插入和查询操作的实现。 数据结构设计 结点结构体 struct QuadtreeNode { int depth; // 结点深度 double x, y; // 结点中心坐标 dou…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的统计与转换实例

    下面是针对“python数据结构之二叉树的统计与转换实例”的详细讲解攻略: 什么是二叉树 二叉树指的是一种树状结构,具有如下特点: 每个节点最多有两个子节点,分别为左子节点和右子节点 左子节点的值比父节点小,右子节点的值比父节点大 二叉树可以是空树,也可以是非空树。 二叉树的遍历 在对二叉树进行操作时,需要对其节点进行遍历。二叉树的遍历方式一般有以下三种: …

    数据结构 2023年5月17日
    00
  • C++数据结构之实现邻接表

    C++数据结构之实现邻接表 在图论中,为了表示节点及其之间的联系,我们需要使用数据结构。邻接表是图的一种常见表示方法,实现方便且高效。 什么是邻接表 邻接表是一种图形式的数据结构,由节点和边组成。它使用链式结构来存储相邻节点的信息。邻接表常用于表示有向图、无向图以及加权图。在邻接表中,每一个节点都存储了一个链表,其中包含了该节点与其他节点之间的连接情况。 实…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:插入排序 Insertion Sort

    Java数据结构及算法实例:插入排序 Insertion Sort 算法简介 插入排序是一种简单的排序算法,它的工作方式是每次将一个待排序的元素与前面已经排好序的元素逐个比较,并插入到合适的位置。插入排序的时间复杂度为O(n^2),是一种比较低效的排序算法。 算法实现 以下是使用Java语言实现插入排序算法的代码: public static void in…

    数据结构 2023年5月17日
    00
  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法可以分为以下步骤: 定义链表节点类Node 首先,在Java中实现链表数据结构,需要定义一个链表节点类,称为Node。Node类中包含两个重要属性: 数据域data,用于存储每个节点的数据信息。 指针域next,用于存储下一个节点的引用。 代码示例: public class Node { public int data; //…

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