常用排序算法
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 }