常见的几种排序方法


冒泡排序

冒泡排序是把较小的数据往前调或者把较大的数据往后调。主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个依次进行比较和交换,就能达到排序目的。
 1 //冒泡排序
 2     public static void bubbleSort(int[] arr) {
 3         for (int i = 0; i < arr.length - 1; i++) {
 4             for (int j = 0; j < arr.length - 1 - i; j++) {
 5                 if (arr[j] > arr[j + 1]) {
 6                     int temp = arr[j];
 7                     arr[j] = arr[j + 1];
 8                     arr[j + 1] = temp;
 9                 }
10             }
11         }
12     }

 

插入排序

将一个记录插入到已排好序的序列中,从而得到一个新的有序序列,将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序
 1 //直接插入排序
 2     public static void insertSort(int[] arr) {
 3         //从第二个数字开始
 4         for (int i = 1; i < arr.length; i++) {
 5             //当前数字小于前一个数
 6             if (arr[i] < arr[i - 1]) {
 7                 //当前数字保存至临时变量
 8                 int temp = arr[i];
 9                 int j;
10                 //遍历当前数字之前的所有数字进行比较,是否大于当前数字
11                 for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
12                     //把满足条件的数字向后移位
13                     arr[j + 1] = arr[j];
14                 }
15                 //不满足条件则表示当前数字比临时变量的数字小
16                 arr[j + 1] = temp;
17             }
18         }
19     }

 

 

选择排序

选择排序是为每一个位置选择当前最小的元素。首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”的选择,直至完成第(n-1)个位置的元素选择,则第n个位置就只剩唯一的最大元素,此时不需再进行选择。
 1  //选择排序
 2     public static void selectSort(int[] arr) {
 3         //遍历所有元素
 4         for (int i = 0; i < arr.length; i++) {
 5             //记录最小值得下标
 6             int minIndex = i;
 7             //与后面每个元素进行比较
 8             for (int j = i + 1; j < arr.length; j++) {
 9                 //如果有元素比minIndex还小
10                 if (arr[minIndex] > arr[j]) {
11                     //则当前元素就位minIndex
12                     minIndex = j;
13                 }
14             }
15             //如果当前下标和minIndex不相等,说明它比minIndex还小,那么就移位
16             if (i != minIndex) {
17                 int temp = arr[i];
18                 arr[i] = arr[minIndex];
19                 arr[minIndex] = temp;
20             }
21         }
22     }

 

快速排序

通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序
 
 1 //快速排序
 2     public static void QuickSort(int[] arr, int start, int end) {
 3         //记录基准数
 4         int stard = arr[start];
 5         //低位起始下标
 6         int low = start;
 7         //高位起始下标
 8         int higt = end;
 9         //满足start<end保证数据不会多余重复比较
10         if (start < end) {
11             //低位下标小于高位下标,开始比较
12             while (low < higt) {
13                 //低位下标小于高位下标,并且高位数大于等于基准数
14                 while ((low < higt) && stard <= arr[higt]) {
15                     //高位数依次向前比较
16                     higt--;
17                 }
18                 //不满足条件时,当前高位数覆盖当前低位数,第一次覆盖时低位数是基准数
19                 arr[low] = arr[higt];
20                 //低位下标小于高位下标,并且低位数小于等于基准数
21                 while ((low < higt && arr[low] <= stard)) {
22                     //低位数依次向后比较
23                     low++;
24                 }
25                 //不满足条件时,当前低位数覆盖当前高位数
26                 arr[higt] = arr[low];
27             }
28             //比较完成后,高位数下标和低位数下标重合,把基准数赋值给重合的位置
29             arr[higt] = stard;
30             //继续递归排序低位数
31             QuickSort(arr, start, low);
32             //继续递归排序高位数
33             QuickSort(arr, low + 1, end);
34         }
35     }

 

归并排序

归并排序是把集合递归划分成为两个短集合,再将两个集合各自再分成两组组。依次类推,当分出来的一个集合只有一个数据时,可以认为这个集合内已经达到了有序,然后再合并相邻的二个集合就可以了。这样通过先递归的分解集合,再合并集合就完成了归并排序。
 
 1  //归并排序
 2     public static void mergeSort(int[] arr, int low, int high) {
 3         int middle = (low + high) / 2;
 4         if (low < high) {
 5             //处理左边
 6             mergeSort(arr, low, middle);
 7             //处理右边
 8             mergeSort(arr, middle + 1, high);
 9             //归并
10             merge(arr, low, middle, high);
11         }
12     }
13 
14     public static void merge(int[] arr, int low, int middle, int high) {
15         //临时数组
16         int[] temp = new int[high - low + 1];
17         //临时数组下标记录
18         int index = 0;
19         //第一组需要遍历的起始下标
20         int i = low;
21         //第二组需要遍历的起始下标
22         int j = middle + 1;
23         //遍历两个数组,取出最小数放入临时数组
24         while (i <= middle && j <= high) {
25             if (arr[i] <= arr[j]) {
26                 temp[index] = arr[i];
27                 i++;
28             } else {
29                 temp[index] = arr[j];
30                 j++;
31             }
32             index++;
33         }
34         //处理多余的数据
35         while (j <= high) {
36             temp[index] = arr[j];
37             j++;
38             index++;
39         }
40         while (i <= middle) {
41             temp[index] = arr[i];
42             i++;
43             index++;
44         }
45         //把临时数组中的数据重新放入原数组
46         for (int k = 0; k < temp.length; k++) {
47             arr[k + low] = temp[k];
48 
49         }
50     }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM