-
冒泡排序
冒泡排序是基础排序算法之一,时间复杂度为O(n^2)。
简单的思路为,对于数组内的每一个索引(位置),分别将该位置上的元素与相邻下一个元素进行对比,若不满足排序要求,则调换位置。潜在的效果是,每一轮循环都能将数组的最值移到数组末尾。

代码示例:
1 public int[] bubbleSort(int[] nums) { 2 int tmp = 0; 3 for (int i = 0; i < nums.length - 1; i++) { 4 boolean flag = false; 5 for (int j = 0; j < nums.length - 1 - i; j++) { 6 if (nums[j] > nums[j + 1]) { 7 tmp = nums[j]; 8 nums[j] = nums[j + 1]; 9 nums[j + 1] = tmp; 10 flag = true; 11 } 12 } 13 if (!flag) { 14 break; 15 } 16 } 17 return nums; 18 }
-
插入排序
插入排序也属于比较基础的排序算法之一,处理大量数据时效率快于冒泡排序,最大时间复杂度为O(n^2)。
简单的思路为,从数组第二个元素 ai (i >= 2)开始遍历,将ai依次与其之前的所有元素进行对比,若不满足排序要求,则与对应位置元素进行调换。潜在效果是,每轮排序都可以将前i-1个元素排列好。

代码示例:
1 public int[] insertionSort(int[] nums){ 2 for (int i = 1; i < nums.length; i++) { 3 int key = 0; 4 int tmp = nums[i]; 5 for (int j = i; j > 0 && tmp < nums[j - 1]; j--){ 6 nums[j] = nums[j - 1]; 7 key = j; 8 } 9 if (nums[i] != tmp) { 10 nums[key - 1] = tmp; 11 } 12 } 13 return nums; 14 }
-
快速排序
快速排序是排序速度相对较快的算法之一,在时间复杂度同为O(nlogn)的排序算法中效率较高。
该算法的基本思想为:
1)先从数列中选取一个数作为基准数;
2)然后将数组中的数分别与基准数相比,比基准数大的元素放至数组末端,比基准数小的元素放至数组首端,这样数组就被分为了两部分;
3)再对两部分数组分别重复步骤1和2,直至最后分割的数组只有一个元素。
如此递归操作便实现了数组排序。

(其中黄色柱图表示基准数,绿色表示比基准数小的元素,紫色表示比基准大的数)
代码示例:
1 public int[] fastSort(int[] nums, int L, int R) { 2 if(nums == null || nums.length < 2){ 3 return nums; 4 } 5 if (L < R){ 6 int mid = getMid(nums, L, R); 7 fastSort(nums, L, mid -1); 8 fastSort(nums, mid + 1, R); 9 } 10 return nums; 11 } 12 public int getMid(int[] nums, int L, int R){ 13 int tmp = nums[L]; //基准值 14 while (L < R){ 15 while (L < R && nums[R] >= tmp){ 16 R--; 17 } 18 nums[L] = nums[R]; 19 while (L < R && nums[L] <= tmp){ 20 L++; 21 } 22 nums[R] = nums[L]; 23 } 24 nums[L] = tmp; 25 return L; 26 }
(以上动图均源自网络)
浙公网安备 33010602011771号