700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java数据结构——直接插入排序+希尔排序+冒泡排序

Java数据结构——直接插入排序+希尔排序+冒泡排序

时间:2022-01-21 13:48:32

相关推荐

Java数据结构——直接插入排序+希尔排序+冒泡排序

文章目录

一、插入排序(一)、什么是插入排序(二)、图例(三)、Java代码 二、希尔排序(一)、什么是希尔排序(二)、图例(三)、Java代码 三、冒泡排序(一)、什么是冒泡排序(二)、图例(三)、Java代码 四、源码

一、插入排序

(一)、什么是插入排序

插入排序 ( InsertionSort ),一般也被称为直接插入排序。函数命名:insertionSort原理

1. 将一个记录插入到“已经排好序”的有序表中。2. 从而形成一个新的、数据项增 1 的“有序表”。

算法

1. 两个for循环2. 外层循环:对除了第一个元素之外的所有元素3. 内层循环:对当前元素前面有序表进行待插入位置查找,并进行移动

性能分析

1. 时间复杂度 O(n^2)2. 空间复杂度 O(1)3. 当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次4. 最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)

(二)、图例

监视哨的目的:避免数组下标出界

(三)、Java代码

insertionSort

/*** 直接插入排序* * @param arrs 待排序数组*/public void insertionSort(int[] arrs) {int n = arrs.length;for (int i = 0; i < n; i++) {// 1. 寻找元素 arrs[i] 合适的插入位置for (int j = i; j > 0; j--) {// 2. 找到合适位置就交换if (arrs[j] < arrs[j - 1]) // 决定升降序swap(arrs, j, j - 1);elsebreak;}}} // insertionSort

swap

/*** 数组两个位置交换* * @param arrs* @param i* @param j*/private void swap(int[] arrs, int i, int j) {int temp = arrs[i];arrs[i] = arrs[j];arrs[j] = temp;} // swap

testOfInsertionSort

public static void testOfInsertionSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.insertionSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}

输出样例

直接插入排序:-99 -1 0 1 5 11 15 20 100

二、希尔排序

(一)、什么是希尔排序

希尔排序,也称递减增量排序算法。希尔排序比直接插入排序更高效:直接插入排序每次只能将数据移动一位希尔排序是非稳定排序算法简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前,这是排序的稳定性原理

1. 先将整个待排序的序列分割成为若干子序列。2. 对子序列分别进行直接插入排序。3. 待每个子序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

算法

1. 确定一个增量k2. 对序列进行 k 趟排序3. 每趟排序,看情况交不交换(升降)4. 仅增量因子为 1 时,排序完成

性能

1. 时间复杂度:O(n^1.5)

(二)、图例

第一趟:增量为5第二趟:增量为3… …直到增量为1

(三)、Java代码

-shellSort

/*** 希尔排序* * @param arrs*/public void shellSort(int[] arrs) {int n = arrs.length;// 1. 以n/2为间隔(增量),直到增量为1for (int step = n / 2; step >= 1; step /= 2) {// 2. 直接插入排序for (int i = step; i < n; i++) {// j每次递减是减少step那么多for(int j=i; j>step-1; j-=step) {if(arrs[j-step] > arrs[j])swap(arrs, j-step, j);elsebreak;}}}} // shellSort

testOfShellSort

/*** 测试希尔排序*/public static void testOfShellSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.shellSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}

输出样例

希尔排序:-99 -1 0 1 5 11 15 20 100

三、冒泡排序

(一)、什么是冒泡排序

这个用的最多,又简单,主要是原理。简单了解一下原理。算法简单。冒泡排序(Bubble Sort)。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。算法

1. 比较相邻的元素。如果第一个比第二个大,就交换。2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。3. 针对所有的元素重复以上的步骤,除了最后一个。4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

性能

1. 时间复杂度:O(n^2)

(二)、图例

(三)、Java代码

bubbleSort

/*** 冒泡排序* * 不正宗,但简单呀* @param arrs*/public void bubbleSort(int[] arrs) {int n = arrs.length;for(int i=0; i<n; i++) {for(int j=0; j<n-1-i; j++) {if(arrs[j] > arrs[j+1]) {swap(arrs, j, j+1);}}}} // bubbleSort

testOfBubbleSort

/*** 测试冒泡排序*/public static void testOfBubbleSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.bubbleSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}

输出样例

冒泡排序:-99 -1 0 1 5 11 15 20 100

四、源码

package sort;public class Sort {/*** 直接插入排序* * @param arrs 待排序数组*/public void insertionSort(int[] arrs) {int n = arrs.length;for (int i = 0; i < n; i++) {// 1. 寻找元素 arrs[i] 合适的插入位置for (int j = i; j > 0; j--) {// 2. 找到合适位置就交换if (arrs[j] < arrs[j - 1]) // 决定升降序swap(arrs, j, j - 1);elsebreak;}}} // insertionSort/*** 数组两个位置交换* * @param arrs* @param i* @param j*/private void swap(int[] arrs, int i, int j) {int temp = arrs[i];arrs[i] = arrs[j];arrs[j] = temp;} // swap/*** 测试直接插入排序*/public static void testOfInsertionSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.insertionSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}/*** 希尔排序* * @param arrs*/public void shellSort(int[] arrs) {int n = arrs.length;// 1. 以n/2为间隔(增量),直到增量为1for (int step = n / 2; step >= 1; step /= 2) {// 2. 直接插入排序for (int i = step; i < n; i++) {// j每次递减是减少step那么多for (int j = i; j > step - 1; j -= step) {if (arrs[j - step] > arrs[j])swap(arrs, j - step, j);elsebreak;}}}} // shellSort/*** 测试希尔排序*/public static void testOfShellSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.shellSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}/*** 冒泡排序* * @param arrs*/public void bubbleSort(int[] arrs) {int n = arrs.length;for (int i = 0; i < n; i++) {for (int j = 0; j < n - 1 - i; j++) {if (arrs[j] > arrs[j + 1]) {swap(arrs, j, j + 1);}}}} // bubbleSort/*** 测试冒泡排序*/public static void testOfBubbleSort() {int[] arrs = {5, 11, 1, 0, -1, 15, 20, 100, -99 };Sort sort = new Sort();sort.bubbleSort(arrs);for (int i = 0; i < arrs.length; i++) {System.out.print(arrs[i]);System.out.print(" ");}}public static void main(String[] args) {System.out.println("\r\n直接插入排序:");testOfInsertionSort();System.out.println("\r\n希尔排序:");testOfShellSort();System.out.println("\r\n冒泡排序:");testOfBubbleSort();}}

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