排序算法-【Java实现】-【桶排序、冒泡排序、快速排序、插入排序】

排序算法-【Java实现】-【桶、冒泡、快速、归并、插入排序】

排序算法演示地址:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

桶排序

顾名思义,将数组分到有限数量的桶子里。如下图:

定义一个桶的数组,将每个元素的值对应桶的下标存入,并将值加一,存完后从头开始往出取,每取一个值减一。

在这里插入图片描述
代码实现:

public static void bucketSort(int[] nums) {
    int max = nums[0];
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] > max) {
            max = nums[i];
        }
    }
    int[] temps = new int[max + 1];
    for (int num : nums) {
        temps[num]++;
    }
    int count = 0;
    for (int i = 0; i < temps.length; i++) {
        while (temps[i] != 0) {
            nums[count] = i;
            temps[i]--;
            count++;
        }
    }
}
public static void main(String[] args) {
    int[] nums = {6,1,2,7,9,3,4,5,0,8};
	System.out.println("排序前:" + Arrays.toString(nums));
    bucketSort(nums);
    System.out.println("排序后:" + Arrays.toString(nums));
}

缺点就是当数值太大时浪费空间,时间复杂度为O(M+N)

复杂的桶排序:(演示地址:https://www.cs.usfca.edu/~galles/visualization/BucketSort.html
在这里插入图片描述

冒泡排序

重复地走扫描要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。
动画演示:

在这里插入图片描述

代码实现:

public static void bubbleSort(int[] nums) {
    for (int i = 0; i < nums.length - 1; i++) {
        for (int j = 0; j < nums.length - 1 - i; j++) {
            if (nums[j] > nums[j+1]) {
                nums[j] = nums[j] ^ nums[j+1];
                nums[j+1] = nums[j] ^ nums[j+1];
                nums[j] = nums[j] ^ nums[j+1];
            }
        }
    }
}
public static void main(String[] args) {
    int[] nums = {6,1,2,7,9,3,4,5,0,8};
	System.out.println("排序前:" + Arrays.toString(nums));
    bubbleSort(nums);
    System.out.println("排序后:" + Arrays.toString(nums));
}

快速排序

首先需要在序列中随便找一个数作为基准数(也就是用来参照的数),然后将序列中比基准数小的放左边,大的放右边,那怎么实现呢?需要定义两个指针 i 和 j,分别从左右两边巡视,左边i指针遇到比基准数大的停下来,右边j指针遇到比基准数小的停下来,然后将做指针i指定的数与右指针j指定的数呼唤,然后继续巡视,知道俩指针相遇,相遇处指定的数与基准数呼唤,这时已经将序列以基准数分为左小右大的序列了,之后从基准数分成两个序列,重新找基准数重复以上过程,知道将序列分的不可分为止。

为了更好的理解可以参考下面两图:

在这里插入图片描述

在这里插入图片描述

动画演示:
在这里插入图片描述
代码实现:

/**
 * 快速排序
 * @param left 左指针 初始值为0
 * @param right 右指针 初始值为数组长度-1
 * @param nums 排序数组
 */
public static void quickSort(int left, int right,int[] nums) {
    if (left >= right) {
        return;
    }
    //基准数
    int temp = nums[left];
    int i = left;
    int j = right;
    while (i < j) {
        //要先从右往左找
        while (nums[j] >= temp && i < j) {
            j--;
        }
        //再从左往右找
        while (nums[i] <= temp && i < j) {
            i++;
        }
        //交换
        if (i < j) {
            nums[i] = nums[i] ^ nums[j];
            nums[j] = nums[i] ^ nums[j];
            nums[i] = nums[i] ^ nums[j];
        }
    }
    //基准数换位
    nums[left] = nums[i];
    nums[i] = temp;
    //分别递归基准数两边的序列
    quickSort(left,i-1,nums);
    quickSort(i+1,right,nums);
}
public static void main(String[] args) {
    int[] nums = {6,1,2,7,9,3,4,5,0,8};
	System.out.println("排序前:" + Arrays.toString(nums));
    quickSort(0,nums.length-1,nums);
    System.out.println("排序后:" + Arrays.toString(nums));
}

归并排序

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

动画演示:

在这里插入图片描述
代码实现:

/**
 * 归并排序
 * @param l 初始值为0
 * @param h 初始值为数组长度-1
 * @param nums 排序前数组
 * @return 排序后数组
 */
public static int[] mergeSort(int l, int h,int[] nums) {
    if (l == h) {
        return new int[]{nums[l]};
    }

    int mid = l + (h - l) / 2;
    //左有序数组
    int[] leftArr = mergeSort(l, mid, nums);
    //右有序数组
    int[] rightArr = mergeSort(mid + 1, h, nums);
    //新有序数组
    int[] newNum = new int[leftArr.length + rightArr.length];

    int m = 0, i = 0, j = 0;
    while (i < leftArr.length && j < rightArr.length) {
        newNum[m++] = leftArr[i] <= rightArr[j] ? leftArr[i++] : rightArr[j++];
    }
    while (i < leftArr.length) {
        newNum[m++] = leftArr[i++];
    }
    while (j < rightArr.length) {
        newNum[m++] = rightArr[j++];
    }
    return newNum;
}
public static void main(String[] args) {
    int[] nums = {6,1,2,7,9,3,4,5,0,8};
	System.out.println("排序前:" + Arrays.toString(nums));
    System.out.println("排序后:" + Arrays.toString(mergeSort(0, nums.length - 1, nums)));
}

插入排序

对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

动画演示:

在这里插入图片描述
代码实现:

public static void insertionSort(int[] nums) {
    for (int i = 1; i < nums.length; i++) {
        int j = i;
        while (j >= 1) {
            if (nums[j] < nums[j-1]) {
                nums[j] = nums[j] ^ nums[j-1];
                nums[j-1] = nums[j] ^ nums[j-1];
                nums[j] = nums[j] ^ nums[j-1];
            }
            j--;
        }
    }
}
public static void main(String[] args) {
    int[] nums = {6,1,2,7,9,3,4,5,0,8};
	System.out.println("排序前:" + Arrays.toString(nums));
    insertionSort(nums);
    System.out.println("排序后:" + Arrays.toString(nums));
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java 中常见的排序算法包括: 1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection Sort) 3. 插入排序(Insertion Sort) 4. 希尔排序(Shell Sort) 5. 归并排序(Merge Sort) 6. 快速排序(Quick Sort) 7. 堆排序(Heap Sort) 8. 计数排序(Counting Sort) 9. 桶排序(Bucket Sort) 10. 基数排序(Radix Sort) 这里简单介绍一下冒泡排序快速排序实现。 1. 冒泡排序 冒泡排序的基本思想是:比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。重复这个过程,直到没有任何一对数字需要比较。 Java 代码实现: ```java public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 快速排序 快速排序是一种常用的排序算法,它的基本思想是:选择一个基准元素,将数组分成两部分,一部分比基准元素小,另一部分比基准元素大,然后对这两部分再分别进行排序。 Java 代码实现: ```java public static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivot = partition(arr, left, right); // 分割点 quickSort(arr, left, pivot - 1); // 对左半部分递归排序 quickSort(arr, pivot + 1, right); // 对右半部分递归排序 } } private static int partition(int[] arr, int left, int right) { int pivot = arr[left]; // 选取第一个元素作为基准元素 int i = left, j = right; while (i < j) { // 从右边扫描,找到第一个小于基准元素的位置 while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i++] = arr[j]; } // 从左边扫描,找到第一个大于基准元素的位置 while (i < j && arr[i] < pivot) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; return i; // 返回分割点的位置 } ``` 以上是两种常见的排序算法Java 实现。在实际应用中,我们需要根据数据量大小、数据分布情况等因素选择合适的排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值