

常见算法总结 - 排序篇
source link: http://vc2x.com/articles/2020/05/05/1588638378006.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文总结了常见高频的关于排序的算法考察。
1.冒泡排序
冒泡排序的思想是元素两两比较,将较大或者较小的元素往一端进行移动
public static void bubble(int[] array) { for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j + 1 < array.length - i; j++) { if (array[j] > array[j + 1]) { int tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; } } } }
2.快速排序
快速排序的思想是随机选取一个数字,并以这个数字为临界点,将数组分成小于临界点的的子数组和大于临界点的子数组,并递归这个过程,即可实现最终的排序。
public static void quick(int[] array, int begin, int end) { if (begin >= end) { return; } int beginRange = begin; int endRange = end; int compareInt = array[begin]; begin++; while (begin < end) { if (array[end] > compareInt) { end--; continue; } if (array[begin] < compareInt) { begin++; continue; } int tmp = array[begin]; array[begin] = array[end]; array[end] = tmp; } if (array[beginRange] > array[begin]) { int tmp = array[begin]; array[begin] = array[beginRange]; array[beginRange] = tmp; } quick(array, beginRange, begin - 1); quick(array, end + 1, endRange); return; }
3.选择排序
选择排序的思想在于每一轮选择一个本轮的极大值,然后放入数组的尾部。最终可实现排序。
public static void selectSort(int[] array) { if (array.length == 0) { return; } for (int i = 0; i < array.length; i++) { int min = array[i]; int minIndex = i; for (int j = i; j < array.length; j++) { if (array[j] < min) { min = array[j]; minIndex = j; } } int tmp = array[i]; array[i] = min; array[minIndex] = tmp; } }
4.归并排序
归并排序的思想在于先排序小的数组,再由小的数组合并成大数组,直到最后合并的数组大小是原数组的大小时,即完成了归并排序。
public static void sort(int[] array, int left, int right) { //1.设置递归的base case if (left == right) { return; } //2.分别排两边 int mid = left + (right - left) / 2; sort(array, left, mid); sort(array, mid + 1, right); //3.合并 merge(array, left, mid + 1, right); } public static void merge(int[] array, int leftPtr, int rightPtr, int rightBound) { int mid = rightPtr - 1; int[] temp = new int[rightBound - leftPtr + 1]; int i = leftPtr, j = rightPtr, k = 0; while (i <= mid && j <= rightBound) { temp[k++] = array[i] <= array[j] ? array[i++] : array[j++]; } while (i <= mid) { temp[k++] = array[i++]; } while (j <= rightBound) { temp[k++] = array[j++]; } //不要忘了把temp数组复制到arr中 for (int m = 0; m < temp.length; m++) { array[leftPtr + m] = temp[m]; } }
5.桶排序
桶排序的思想在于,根据数组中的最大值和最小值的差值作为区间拆分为N个桶,将元素落入这些桶当中,进行排序再合并。
public static void bucketSort(int[] array){ int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int i = 0; i < array.length; i++){ max = Math.max(max, array[i]); min = Math.min(min, array[i]); } //桶数 int bucketNum = (max - min) / array.length + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum); for(int i = 0; i < bucketNum; i++){ bucketArr.add(new ArrayList<Integer>()); } //将每个元素放入桶 for(int i = 0; i < array.length; i++){ int num = (array[i] - min) / (array.length); bucketArr.get(num).add(array[i]); } //对每个桶进行排序 for(int i = 0; i < bucketArr.size(); i++){ Collections.sort(bucketArr.get(i)); } int k = 0; for (int i = 0; i < bucketArr.size(); i++) { for (Integer integer : bucketArr.get(i)) { array[k++] = integer; } } }
6.计数排序
计数排序为特殊的桶排序,一个桶的值区间为1。
public static int[] countSort(int[] array) { if (array == null || array.length == 0) { return null; } int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; //找出数组中的最大最小值 for (int i = 0; i < array.length; i++) { max = Math.max(max, array[i]); min = Math.min(min, array[i]); } int help[] = new int[max]; //找出每个数字出现的次数 for (int i = 0; i < array.length; i++) { int mapPos = array[i] - min; help[mapPos]++; } int index = 0; for (int i = 0; i < help.length; i++) { while (help[i]-- > 0) { array[index++] = i + min; } } return array; }
7.希尔排序
希尔排序的思想在于步长。先让元素从数组的一半作为步长,进行比较替换,再依次减小步长,当步长为0时,即完成排序。它主要的优势是避免冒泡排序每次交换步长为1的低效率。
public static void shellSort(int[] arr) { //step:步长 for (int step = arr.length / 2; step > 0; step /= 2) { //对一个步长区间进行比较 [step,arr.length) for (int i = step; i < arr.length; i++) { int value = arr[i]; int j; //对步长区间中具体的元素进行比较 for (j = i - step; j >= 0 && arr[j] > value; j -= step) { //j为左区间的取值,j+step为右区间与左区间的对应值。 arr[j + step] = arr[j]; } //此时step为一个负数,[j + step]为左区间上的初始交换值 arr[j + step] = value; } } }
笔者个人总结,如有错误之处望不吝指出。
Recommend
-
48
-
64
一、排序算法 1、冒泡排序(Bubble Sort) 定义:是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就...
-
11
图示阅读的顺序为从左到右,从上到下 近期在看一些算法相关的知识,这里总结整理下常见排序算法的 JavaScript 实现,并添加图解方便理解。 下面是一些代码中会用到的公共方法,为了避免代码...
-
15
因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法: 直接插入排序 简单选择排序 我们讨论的这八大排序...
-
10
前言 相信所有的程序员刚开始接触到的算法都会是排序算法,因为排序在对数据处理和计算有这重要的地位,排序算法往往是其他算法的基础;本文我们就先从初级排序算法开始学习算法。 排序算法的模板 在开始之前我们先定义一个排序...
-
12
排序算法是数组相关算法的基础知识之一,它们的经典思想可以用于很多算法之中。这里详细介绍和总结 7 种最常见排序算法,并用 Go 做了实现,同时对比这几种算法的时间复杂度、空间复杂度和稳定性 。后一部分是对 Go 标...
-
10
JavaScript 之常见算法排序 冒泡排序即数组从头到尾,依次比较相邻两数的大小,不符合顺序则交换位置,一直循环直到排序完成。如果是升序排序,那么每一轮的一系列比较和交换之后,最大那个...
-
3
联系方式(qq):623847465 gitee(码云): Mercury. (zzwlwp) - Gitee.com 键盘在左,鼠标在右,他们只要一个文本文件就可以创造一个未来。😎 你与程序员或许只差左...
-
6
对比几种常见的排序算法@0xinhua 发布于 2017年12月13日计算机科学里,排序算法是最基础算法之一,排序的方式有很多种,例如我们常见的冒泡排序、插入排序、快排等,这类需要对系列值进行比较的方法,称为基于比较排序...
-
5
js的常见的4种排序算法更新日期: 2023-03-17阅读: 15标签: 算法分享...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK