Java数据结构的十大排序

yizhihongxing

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日

相关文章

  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

    数据结构 2023年5月17日
    00
  • 如何配置git环境

    首先我们新建一个文件夹;    然后我们右键git Bash Here一下;在里面输入: cd ssh-keygen cd.ssh ls (注意,我们要是之前就生成过密钥,直接输入ls就好了) 输入ls之后,会显示出来我们的公钥,我们输入: cat id_rsa.pub 然后密钥就出来了,密钥出来之后,我们把密钥复制一下,打开github 选择设置; 中会有…

    算法与数据结构 2023年4月18日
    00
  • Codeforces Round 866 (Div. 2)

    A. Yura’s New Name 题意: 给出一个仅由_或^组成的字符串,你可以在任意位置添加_或^字符,使得字符串满足:任意字符要么属于^_^的一部分,要么属于^^的一部分。求最少添加的字符数量。 分析: 对于_我们只需处理没有组成^_^的_: ①如果_在首位置且左边没有^则添加^ ②如果_在尾位置且右边没有^则添加^ ③如果_在中间部分且右边没有^则…

    算法与数据结构 2023年4月25日
    00
  • Java常见数据结构面试题(带答案)

    Java常见数据结构面试题(带答案)完整攻略 介绍 在Java面试中,数据结构不可避免地成为一部分的考察内容。因此,掌握Java常见数据结构,对于提高面试成功率十分必要。本篇攻略将会介绍常见的Java数据结构,并提供相应的面试题目和答案,希望可以帮助面试者在面试当中更好地展示自己的实力。 目录 结构体 数组 链表 栈 队列 树 哈希表 结构体 在Java中并…

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

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

    数据结构 2023年5月17日
    00
  • C语言数据结构深入探索顺序表

    C语言数据结构深入探索顺序表攻略 一、概述 顺序表是一种线性结构,是计算机程序中最常见的数据结构之一。在C语言中,顺序表可以用数组来实现。本篇文章将深入讲解顺序表的原理和实现方法,帮助读者加深对顺序表的理解,并掌握如何用C语言代码实现顺序表。 二、顺序表的定义和特点 顺序表是指用一组地址连续的存储单元依次存储线性表中的各个元素,用于表示具有相同数据类型的n个…

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