常用排序算法

1.冒泡排序(性能最差)

 1 /**
 2  * 
 3  */
 4 package suanfa;
 5 
 6 import java.util.Arrays;
 7 
 8 public class Maopao {
 9 
10     public static void main(String[] args) {
11         int[] nums = { 11, 3, 15, 8, 9, 7, 6 };
12         System.out.println("排序前:" + Arrays.toString(nums));
13         int i, j, temp;
14         boolean swaped = true;
15         for (i = nums.length - 1; i > 0 && swaped; i--) {
16             swaped = false;
17             for (j = 0; j < i; j++) {
18                 if (nums[j] > nums[j + 1]) {
19                     temp = nums[j];
20                     nums[j] = nums[j + 1];
21                     nums[j + 1] = temp;
22                     swaped = true;
23                 }
24             }
25         }
26         System.out.println("排序后:" + Arrays.toString(nums));
27     }
28 }

2.选择排序(性能比冒泡好点)

 1 /**
 2  * 
 3  */
 4 package suanfa;
 5 
 6 import java.util.Arrays;
 7 
 8 public class Xuanze {
 9 
10     public static void main(String[] args) {
11         int[] nums = { 11, 3, 15, 8, 9, 7, 6 };
12         System.out.println("排序前:" + Arrays.toString(nums));
13         int i, j, min, temp;
14         for (i = 0; i < nums.length - 1; i++) {
15             min = i;
16             for (j = i + 1; j < nums.length; j++) {
17                 if (nums[j] < nums[min]) {
18                     min = j;
19                 }
20             }
21             temp = nums[min];
22             nums[min] = nums[i];
23             nums[i] = temp;
24         }
25         System.out.println("排序后:" + Arrays.toString(nums));
26     }
27 }

3.插入排序(性能比选择好)

 1 /**
 2  * 
 3  */
 4 package suanfa;
 5 
 6 import java.util.Arrays;
 7 
 8 public class Charu {
 9 
10     public static void main(String[] args) {
11         int[] nums = { 1, 2, 3, 4, 5, 8, 9, 7, 6 };
12         System.out.println("排序前:" + Arrays.toString(nums));
13         int i, j;
14         for (i = 1; i < nums.length; i++) {
15             for (j = i; j > 0; j--) {
16                 if (nums[j] < nums[j - 1]) {
17                     int temp = nums[j];
18                     nums[j] = nums[j - 1];
19                     nums[j - 1] = temp;
20                 } else {
21                     break;
22                 }
23             }
24         }
25         System.out.println("排序后:" + Arrays.toString(nums));
26     }
27 }

4.希尔排序(插入排序的优化版)

 1 package sort;
 2 
 3 import java.util.Arrays;
 4 
 5 public class ShellSort {
 6 
 7     public static void main(String[] args) {
 8         int[] nums = { 4, 3, 1, 5, 2,6,8,10,9,11,20,21,36,13,15,17};
 9         sort(nums);
10         System.out.println("排序后:" + Arrays.toString(nums));
11     }
12 
13     public static void sort(int[] arr) {
14         //增量gap,并逐步缩小增量
15         for (int gap = arr.length / 2; gap > 0; gap /= 2) {
16             //从第gap个元素,逐个对其所在组进行直接插入排序操作
17             int i,j;
18             for (i = gap; i < arr.length; i++) {
19                 for(j=i;j - gap >= 0;j -= gap) {
20                     if(arr[j] < arr[j - gap]) {
21                         swap(arr, j, j - gap);
22                     }else {
23                         break;
24                     }
25                 }
26             }
27         }
28     }
29 
30     public static void swap(int[] arr, int a, int b) {
31         arr[a] = arr[a] + arr[b];
32         arr[b] = arr[a] - arr[b];
33         arr[a] = arr[a] - arr[b];
34     }
35 }

 

5.快速排序(性能最好,不稳定)

 1 /**
 2  * 
 3  */
 4 package suanfa;
 5 
 6 import java.util.Arrays;
 7 
 8 public class Kuaisu {
 9 
10     public static void main(String[] args) {
11         int[] a = { 4, 2, 10, 5, 3, 7, 6, 8 };
12         System.out.println("排序前:" + Arrays.toString(a));
13         quickSort(a, 0, a.length - 1);
14         System.out.println("排序后:" + Arrays.toString(a));
15     }
16 
17     public static void quickSort(int[] a, int l, int r) {
18         if (l < r) {
19             int i, j, x;
20             i = l;
21             j = r;
22             x = a[i];
23             while (i < j) {
24                 while (i < j && a[j] > x)
25                     j--; // 从右向左找第一个小于x的数
26                 if (i < j)
27                     a[i++] = a[j];
28                 while (i < j && a[i] < x)
29                     i++; // 从左向右找第一个大于x的数
30                 if (i < j)
31                     a[j--] = a[i];
32             }
33             a[i] = x;
34             quickSort(a, l, i - 1); /* 递归调用 */
35             quickSort(a, i + 1, r); /* 递归调用 */
36         }
37     }
38 
39 }

 6.归并排序(性能比快排稍差,稳定)

 1 // 归并排序(Java-迭代版)
 2     public static void merge_sort(int[] arr) {
 3         int len = arr.length;
 4         int[] result = new int[len];
 5         int block, start;
 6 
 7         // 原版代码的迭代次数少了一次,没有考虑到奇数列数组的情况
 8         for (block = 1; block < len * 2; block *= 2) {
 9             for (start = 0; start < len; start += 2 * block) {
10                 int low = start;
11                 int mid = (start + block) < len ? (start + block) : len;
12                 int high = (start + 2 * block) < len ? (start + 2 * block) : len;
13                 // 两个块的起始下标及结束下标
14                 int start1 = low, end1 = mid;
15                 int start2 = mid, end2 = high;
16                 // 开始对两个block进行归并排序
17                 while (start1 < end1 && start2 < end2) {
18                     result[low++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
19                 }
20                 while (start1 < end1) {
21                     result[low++] = arr[start1++];
22                 }
23                 while (start2 < end2) {
24                     result[low++] = arr[start2++];
25                 }
26             }
27             int[] temp = arr;
28             arr = result;
29             result = temp;
30         }
31         result = arr;
32     }
 1 // 归并排序(Java-递归版)
 2     static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {
 3         if (start >= end)
 4             return;
 5         int len = end - start, mid = (len >> 1) + start;
 6         int start1 = start, end1 = mid;
 7         int start2 = mid + 1, end2 = end;
 8         merge_sort_recursive(arr, result, start1, end1);
 9         merge_sort_recursive(arr, result, start2, end2);
10         int k = start;
11         while (start1 <= end1 && start2 <= end2)
12             result[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
13         while (start1 <= end1)
14             result[k++] = arr[start1++];
15         while (start2 <= end2)
16             result[k++] = arr[start2++];
17         for (k = start; k <= end; k++)
18             arr[k] = result[k];
19     }
20 
21     public static void merge_sort2(int[] arr) {
22         int len = arr.length;
23         int[] result = new int[len];
24         merge_sort_recursive(arr, result, 0, len - 1);
25     }

 

posted @ 2020-11-14 20:13  万丈天涯  阅读(108)  评论(0编辑  收藏  举报