java常用排序算法

一、冒泡排序

  1、基本介绍

  冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置
一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)
  例如:

  
  
  

  2、代码实现

  

 1     //基础版
 2     public static void bubbleSort_v1(int[] arr) {
 3         int tmp=0;
 4         for (int i = 0; i < arr.length - 1; i++) {
 5             for (int j = 0; j < arr.length - 1 - i; j++) {
 6                 if (arr[j] > arr[j + 1]) {
 7                     tmp = arr[j];
 8                     arr[j] = arr[j + 1];
 9                     arr[j + 1] = tmp;
10                 }
11             }
12         }
13     }

 

 1  //加强版
 2     public static void bubbleSort_v2(int[] arr) {
 3         boolean flag = false;
 4         int tmp=0;
 5         for (int i = 0; i < arr.length - 1; i++) {
 6             for (int j = 0; j < arr.length - 1 - i; j++) {
 7                 if (arr[j] > arr[j + 1]) {
 8                     flag=true;
 9                     tmp = arr[j];
10                     arr[j] = arr[j + 1];
11                     arr[j + 1] = tmp;
12                 }
13             }
14             //如果没进入比较,则表示已经是有序数组,中断排序即可
15             if(!flag){
16                 break;
17             }else {
18                 flag=false;
19             }
20         }
21     }

 

 

二、快速排序

  

  1、基本介绍 

  快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

  

  

  2、代码实现

 

三、直接插入排序

   

  1、基本介绍 

  插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表

  

  

  2、代码实现

   

 1  public  static void insertSort_v1(int[] arr){
 2         //从第二个元素开始,因为如果从第一个元素向前插入,第一个元素之前是没有数据的
 3         for (int i = 1; i < arr.length; i++) {
 4             //从第i个元素开始向前查找正确的插入位置
 5             //下标j>0并且当前元素值arr[j]小于arr[j-1]时,进入循环,即从小到大
 6             for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
 7                 if (arr[j] < arr[j - 1]) {
 8                     int tmp = arr[j];
 9                     arr[j] = arr[j - 1];
10                     arr[j - 1] = tmp;
11                 }
12             }
13 
14         }
15     }

 

  

 1  public  static void insertSort_v2(int[] arr){
 2         for (int i = 1; i < arr.length; i++) {
 3             // 寻找元素arr[i]合适的插入位置
 4             int e = arr[i];
 5             int j = 0;
 6             // j保存元素e应该插入的位置,一次赋值,交换一次需要三次赋值
 7             for (j = i; j > 0 && arr[j - 1] > e; j--) {
 8                 //此时arr[j],arr[j-1]是同一个数
 9                 arr[j] = arr[j - 1];
10             }
11             //j是arr[i]应该插入的位置
12             arr[j] = e;
13         }
14     }

 

3.1、折半插入排序

  

  1、基本介绍 

  2、代码实现

 

四、希尔排序

  

  1、基本介绍 

 

  

  

  

  2、演化

  

 1  //演化
 2     private void evolution(){
 3         int[] arr = { 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 };
 4         int temp = 0;
 5         // 希尔排序的第1轮排序
 6         // 因为第1轮排序,是将10个数据分成了 5组
 7         for (int i = 5; i < arr.length; i++) {
 8             // 遍历各组中所有的元素(共5组,每组有2个元素), 步长5
 9             for (int j = i - 5; j >= 0; j -= 5) {
10                 // 如果当前元素大于加上步长后的那个元素,说明交换
11                 if (arr[j] > arr[j + 5]) {
12                     temp = arr[j];
13                     arr[j] = arr[j + 5];
14                     arr[j + 5] = temp;
15                 }
16             }
17         }
18 
19         System.out.println("希尔排序1轮后=" + Arrays.toString(arr));//
20 
21 
22         // 希尔排序的第2轮排序
23         // 因为第2轮排序,是将10个数据分成了 5/2 = 2组
24         for (int i = 2; i < arr.length; i++) {
25             // 遍历各组中所有的元素(共5组,每组有2个元素), 步长5
26             for (int j = i - 2; j >= 0; j -= 2) {
27                 // 如果当前元素大于加上步长后的那个元素,说明交换
28                 if (arr[j] > arr[j + 2]) {
29                     temp = arr[j];
30                     arr[j] = arr[j + 2];
31                     arr[j + 2] = temp;
32                 }
33             }
34         }
35 
36         System.out.println("希尔排序2轮后=" + Arrays.toString(arr));//
37 
38         // 希尔排序的第3轮排序
39         // 因为第3轮排序,是将10个数据分成了 2/2 = 1组
40         for (int i = 1; i < arr.length; i++) {
41             // 遍历各组中所有的元素(共5组,每组有2个元素), 步长5
42             for (int j = i - 1; j >= 0; j -= 1) {
43                 // 如果当前元素大于加上步长后的那个元素,说明交换
44                 if (arr[j] > arr[j + 1]) {
45                     temp = arr[j];
46                     arr[j] = arr[j + 1];
47                     arr[j + 1] = temp;
48                 }
49             }
50         }
51 
52         System.out.println("希尔排序3轮后=" + Arrays.toString(arr));//
53     }

 

  3、代码实现

  

 1  // 希尔排序时, 对有序序列在插入时采用->交换法
 2     public static void sellSort_v1(int [] arr){
 3         int tmp = 0;
 4         for (int gap =arr.length/2 ; gap >0 ; gap/=2) {
 5             for (int i = gap; i <arr.length ; i++) {
 6                 // 遍历各组中所有的元素(共gap组,每组有个元素), 步长gap
 7                 for (int j = i-gap; j >=0; j-=gap) {
 8                     // 如果当前元素大于加上步长后的那个元素,说明交换
 9                     if(arr[j]<arr[j+gap]){
10                         tmp= arr[j];
11                         arr[j]=arr[j+gap];
12                         arr[j+gap]=tmp;
13                     }
14                 }
15             }
16         }
17     }

 

   

 1  //对交换式的希尔排序进行优化->移位法
 2     public static void sellSort_v2(int [] arr){
 3         for (int gap =arr.length/2 ; gap >0 ; gap/=2) {
 4             // 从第gap个元素,逐个对其所在的组进行直接插入排序
 5             for (int i = gap; i < arr.length; i++) {
 6                 int j = i;
 7                 int tmp = arr[j];
 8                 if(arr[j]<arr[j-gap]){
 9                     while (j - gap >= 0 && tmp < arr[j - gap]) {
10                         //移动
11                         arr[j] = arr[j-gap];
12                         j -= gap;
13                     }
14                     //当退出for后,就给temp找到插入的位置
15                     arr[j]=tmp;
16                 }
17             }
18         }
19     }

 

五、直接选择排序

  1、基本介绍

  选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

  

  

  2、代码实现

  

 1  //O(n2)
 2     public static void selectSort(int[] arr){
 3         for (int i = 0; i < arr.length-1; i++) {
 4             //假定最小值为i
 5             int minIndex = i;
 6             //j从i+1开始
 7             for (int j = i+1; j <arr.length ; j++) {
 8                 //如果假定的最小值大于后面一个元素即arr[j],则吧minIndex指向arr[j]
 9                 //否则不进入if判断
10                 if(arr[minIndex]>arr[j]){
11                     minIndex = j;
12                 }
13             }
14             //如果minIndex没有变化,即,minIndex就是arr[i],不需交换
15             if(minIndex!=i) {
16                 int tmp = arr[i];
17                 arr[i] = arr[minIndex];
18                 arr[minIndex] = tmp;
19             }
20         }
21     }

 

 

六、堆排序

  

  1、基本介绍 

  

  

  2、代码实现

 

七、归并排序

  1、基本介绍 

  

  

  2、代码实现

 

八、基数排序

  1、基本介绍 

    

    

  2、代码实现

九、桶排序

  1、基本介绍 

  

  2、代码实现

十、基数排序

  1、基本介绍

  

  2、代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值