Java 常用八大排序

 

JAVA常用八大排序

引用:https://blog.csdn.net/qq_45270751/article/details/121066947

 

1.冒泡排序

2.选择排序

3.插入排序

4.希尔排序

5.堆排序

6.快速排序

7.归并排序

8.计数排序

 

冒泡排序

原理:在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。

代码实现

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class BubbleSortLesson01 {
 6     public static void main(String[] args) {
 7         int[] array1={2,5,8,6,9,4,3,7};
 8         System.out.println(Arrays.toString(array1));
 9         bubbleSort(array1); //调用冒泡方法
10         System.out.println(Arrays.toString(array1));
11 
12     }
13 //    冒泡方法
14     public static void bubbleSort(int[] array){
15         // 控制比较的次数,从最大值初步递减,缩小比较范围。
16         for (int i = array.length; i >0 ; i--) {
17 //           比较的数字逐步递增,且执行大数向右移动。
18             for (int j = 1; j <i; j++) {
19                 //比较相邻两个数字的大小
20                 if (array[j]<array[j-1]){
21                     //大数向右移动
22                     int tmp = array[j];
23                     array[j] = array[j-1];
24                     array[j-1] = tmp;
25                 }
26             }
27         }
28     }
29 }
复制代码

执行结果

 

 

代码优化1

假设给定的数组就是有序的 ,利用建立标签,减少排序的搜索的次数。

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class BubbleSortLesson02 {
 6     public static void main(String[] args) {
 7         int[] array1={2,3,4,5,6,7,9,8};
 8         System.out.println(Arrays.toString(array1));
 9         bubbleSort(array1); //调用冒泡方法
10         System.out.println(Arrays.toString(array1));
11 
12     }
13 //    冒泡方法优化利用flag减少遍历次数。
14     public static void bubbleSort(int[] array){
15         // 控制比较的次数,从最大值初步递减,缩小比较范围。
16         for (int i = array.length; i >0 ; i--) {
17             //
18             boolean flag = true;  //定义一个flag 为true
19 //           比较的数字逐步递增,且执行大数向右移动。
20             for (int j = 1; j <i; j++) {
21                 //比较相邻两个数字的大小
22                 if (array[j]<array[j-1]){
23                     //大数向右移动
24                     int tmp = array[j];
25                     array[j] = array[j-1];
26                     array[j-1] = tmp;
27                     flag =false;  //执行比较 布尔值为false
28                 }
29             }
30             // 没有执行移动,flag为默认值,表示排序完成。
31             if (flag){    
32                 break; //跳出循环
33             }
34         }
35     }
36 }
复制代码

执行结果

代码优化2

假设给定的数组尾部数据是升序的。

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class BubbleSortLesson03 {
 6     public static void main(String[] args) {
 7         int[] array1={5,3,2,4,7,6,8,9};
 8         System.out.println(Arrays.toString(array1));
 9         bubbleSort(array1); //调用冒泡方法
10         System.out.println(Arrays.toString(array1));
11 
12     }
13 //    冒泡方法优化 跳过尾端升序数字,不进行扫描,缩短搜索时间
14     public static void bubbleSort(int[] array){
15         // 控制比较的次数,从最大值初步递减,缩小比较范围。
16         for (int i = array.length; i >0 ; i--) {
17             // 设置初始值,在完全有序时有效,结束程序
18             int sortedIndex = 0;
19 //           比较的数字逐步递增,且执行大数向右移动。
20             for (int j = 1; j <i; j++) {
21                 //比较相邻两个数字的大小
22                 if (array[j]<array[j-1]){
23                     //大数向右移动
24                     int tmp = array[j];
25                     array[j] = array[j-1];
26                     array[j-1] = tmp;
27                     sortedIndex = j;  //记录最后一次移动位置
28                 }
29             }
30             // 将最后一次移动位置赋值给i,此时减小了扫描最大值
31            i =sortedIndex;
32         }
33     }
34 }
复制代码

执行结果

 

选择排序

原理:每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完

 

代码实现

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class SelectSortLesson01 {
 6     public static void main(String[] args) {
 7         int[] array1 = {3,5,9,8,7,6,4,2,1};
 8         System.out.println(Arrays.toString(array1));
 9         selectSort(array1);
10         System.out.println(Arrays.toString(array1));
11     }
12     //选择排序,找到最大值,依次放在最后
13     public static void selectSort(int[] array) {
14         // 控制扫描的数量,递减
15         for (int i = array.length-1 ; i > 0; i--) {
16             // 定义一个最大值初始下标为0;
17             int imax =0;
18             for (int j = 1; j <= i; j++) {
19                 if(array[j]>array[imax]) { 
20                     // 判断是下标j值否大于下标0值,是那么最大值的更新下标
21                     imax = j;
22                 }
23             }
24             int tmp = array[i];
25             array[i] = array[imax];
26             array[imax] = tmp;
27         }
28     }
29 }
复制代码

实现结果

 

优化代码

原理:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import com.sun.scenario.effect.impl.sw.java.JSWColorAdjustPeer;
 4 
 5 import java.util.Arrays;
 6 
 7 public class SelectSortLesson02 {
 8         public static void main(String[] args) {
 9             int[] array1 = {3,8,9,5,7,6,4,2,1};
10             System.out.println(Arrays.toString(array1));
11             selectSort(array1);
12             System.out.println(Arrays.toString(array1));
13         }
14     public static void selectSort(int[] array){
15         int left = 0; //  左区间
16         int right = array.length-1;  // 右区间
17         while (left<right){
18             int imin= left;  // 记录最小值的下标
19             int imax = left;  // 记录最大值的下标
20 
21             for (int i = left; i<=right ; i++) {
22 
23                 if (array[i] < array[imin]) {
24                     imin = i; //更新最小值下标
25                 }
26                 if (array[i] > array[imax]) {
27                     imax = i;  //更新最大值下标
28                 }
29             }
30             // 交换最小值,调用下面的交换方法
31             swap(array,left,imin);
32             // 例:最小值交换完成,2-8已经交换,再次更新imax值,避免执行最大值交换时,2-8再次交换。
33             if (imax == left){
34                 imax=imin;
35             }
36             //  交换最大值,调用下面交换方法
37             swap(array,right,imax);
38             //调整排序区间
39             left++;
40             right--;
41         }
42     }
43     //常用交换位置的方法
44     public static void swap(int[] array ,int i ,int j){
45         int tmp =array[i];
46         array[i] =array[j];
47         array[j]=tmp;
48     }
49 }
复制代码

实现结果

 

插入排序

原理:每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入

代码实现

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class SelectSortLesson03 {
 6     public static void main(String[] args) {
 7         int[] array1 = {3,8,9,5,7,6,4,2,1};
 8         System.out.println(Arrays.toString(array1));
 9         selectSort(array1);
10         System.out.println(Arrays.toString(array1));
11     }
12     public static void selectSort(int[] array){
13         for (int i = 1; i < array.length ; i++) {
14             int insertIndex = i;  //下标
15             int insertValue = array[i];  //临时值
16             while (insertIndex > 0 && insertValue < array[insertIndex-1]){
17                 array[insertIndex]=array[insertIndex-1];
18                 insertIndex--;
19             }
20             array[insertIndex]= insertValue;  //替换
21         }
22     }
23 }
复制代码

 

实现结果

 

希尔排序

希尔排序是对直接插入排序的优化 ,希尔排序法又称缩小增量法。

原理:插入排序是步长位1的排序,希尔排序是步长不断缩小直到步长1的排序。

代码实现

复制代码
 1 package com.luckylu.sortMethod;
 2 
 3 import java.util.Arrays;
 4 
 5 public class ShellSortLesson {
 6     public static void main(String[] args) {
 7         int[] array1 = {3,8,9,5,7,6,4,2,1};
 8         System.out.println(Arrays.toString(array1));
 9         shellSort(array1);
10         System.out.println(Arrays.toString(array1));
11         }
12 
13     public static void shellSort(int[] array) {
14         // 步长gap ,gap = array.length/2 间隔几个元素进行排序;gap/=2 实现二叉树;
15         for (int gap = array.length/2; gap >0 ; gap/=2) {
16             //步长位gap的 插入排序
17             for (int i = gap; i <array.length ; i++) {
18                 int insertIdex = i;
19                 int insertValue = array[i];
20                 while (insertIdex-gap>=0 && insertValue<array[insertIdex-gap]){
21                     array[insertIdex]=array[insertIdex-gap];
22                     insertIdex-=gap;
23                 };
24                 array[insertIdex]=insertValue;
25             }
26         }
27     }
28 }
复制代码

 

 

实现结果

 

 

堆排序

原理:指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

 

代码实现

 

 

实现结果

 

 

快速排序

原理:从待排序区间选择一个数,作为基准值 , 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可 以包含相等的)放到基准值的右边 , 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间 的长度 == 0,代表没有数据

代码实现

 

 

实现结果

 

 

归并排序

原理:将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子 序列段间有序

代码实现

 

 

实现结果

 

 

计数排序

原理:计数排序是一种牺牲内存空间来换取低时间的排序算法,同时它也是一种不基于比较的算法。这里的不基于比较指的是数组元素之间不存在比较大小的排序算法

代码实现

 

 

实现结果

 

posted @   luckylu1983  阅读(247)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示