700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java:选择排序 插入排序 冒泡排序 快速排序算法详解

Java:选择排序 插入排序 冒泡排序 快速排序算法详解

时间:2023-02-24 16:28:40

相关推荐

Java:选择排序 插入排序 冒泡排序 快速排序算法详解

常见排序算法可以分为两大类:

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

下面代码主要展示展示选择排序、冒泡排序、快速排序算法三种算法

package com.zbj;import java.util.Arrays;import org.junit.After;import org.junit.Test;public class ArraySort {int[] arr = {3, 8, 20, 15, 11, 7, 19, 14, 17, 1, 10, 2, 18, 9, 5 };@After // 每执行完一个@Test方法后,都执行打印数组操作public void print() {System.out.println(Arrays.toString(arr));}/*** ①选择排序:每一趟从待排序的记录中选出最小的元素, * 顺序放在已排好序的序列最左边(或右边), * 直到全部记录排序完毕。*/@Testpublic void SelectSort() {for (int i = 0; i < arr.length; i++) {for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {// 每次循环 i下标都固定,循环遍历出最小int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}}/*** ②冒泡排序:比较前后相邻的二个数据,* 如果前面数据大于后面的数据, * 就将这二个数据交换。*/@Testpublic void BubbleSort() {for (int i = 0; i < arr.length; i++) {for (int j = 0; j + 1 < arr.length - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}/*** 插入排序:它的工作原理是通过构建有序序列,* 对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。*/@Testpublic void InsertSort() {for (int i = 1; i < arr.length; i++) {int preIndex = i - 1; //前一个下标int data = arr[i]; //当前数据while (0<=preIndex&& data<arr[preIndex]) {//前一个数是否大于当前数据arr[preIndex + 1] = arr[preIndex];preIndex--;}arr[preIndex + 1] = data;}}/*** 快速排序:通过一躺排序将要排序的数据分割成独立的两部分,* 其中一部分的所有数据都比另外一不部分的所有数据都要小,* 然后再按次方法对这两部分数据分别进行快速排序,* 整个排序过程可以递归进行,以此达到整个数据变成有序序列。*/@Testpublic void QuickSort() {qsort(arr, 0, arr.length - 1);}private void qsort(int[] arr, int left, int right) {int i = left; //确定左边位置int j = right; //确定右边位置if (left >= right) {return;}int p = arr[left]; // 左边作为基准值while (left < right) {while (p < arr[right] && left < right)right--; // 直到右边小于基准值且右边大于左边arr[left] = arr[right];while (p > arr[left] && left < right)left++;arr[right] = arr[left];}arr[left] = p; // 循环结束,把重合位置放进基准值(这里由于取了左边做基准值,故不需要再使用temp做中间值)qsort(arr, i, left - 1);qsort(arr, left + 1, j);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。