sort - 图2


0 bubble

  1. let a = [1, 3, 7, 2, 4];
  2. function bubbleSort(arr) {
  3. for (let i = 0; i < arr.length; i++) {
  4. for (let j = 0; j < arr.length - i - 1; j++) {
  5. if (arr[j] > arr[j + 1]) {
  6. let temp = arr[j];
  7. arr[j] = arr[j + 1];
  8. arr[j + 1] = temp;
  9. }
  10. }
  11. }
  12. }

0.5选择排序

class Solution {
   public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;//每一趟循环比较时,min用于存放较小元素的数组下标,这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,避免每次遇到较小元素都要进行交换。
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    min = j;
                }
            }
            //进行交换,如果min发生变化,则进行交换
            if (min != i) {
                exch(arr,min,i);
            }
        }
    } 
    private void exch(int[] nums, int i, int j){
        int t =nums[i];
        nums[i] = nums[j];
        nums[j] =t;
    }   
}

1 插入排序

class Solution {
    public int[] sortArray(int[] nums) {
        int len= nums.length;
        for(int i = 0; i<len; i++){
                for(int j = i; j>0  && (nums[j] <nums[j-1]); j--){
                    // j>0 不等于0 , 因为nums[j] <nums[j-1]
                        exch(nums, j-1, j);        
                }
        }
        return nums;   
    }
    private void exch(int[] nums, int i, int j){
        int t =nums[i];
        nums[i] = nums[j];
        nums[j] =t;
    }   
}

2 mergeSort

3 快速排序

  • 颜色分类(荷兰国旗)
  • 正常排序数组

  • 颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

class Solution {
    public void sortColors(int[] nums) {
        int len = nums.length-1;
        int lo = 0, i = lo;
        //key i开始的位置, 与确定大小的元素对比时 从0开始
        //                   与第一个元素相比的时候(sort array);
            while(i <= len){
                if(nums[i] < 1){
                swap(nums,i++, lo++);
                }
                else if(nums[i] > 1){
                    swap(nums, i, len--);
                }
                else{
                    i++;
                }
            }
    }
    private void swap(int[]nums, int i , int j){
        int t  = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
}
  • 排序数组
  • nums = { 2,4,5,1,4,8,3};
class Solution {
    public int[] sortArray(int[] nums) {   
        quick(nums, 0, nums.length-1);
        return nums;
    }
    public void quick(int[] nums, int lo, int hi){
        if(hi<=lo) return; 
        int lt = lo, i = lo+1, gt = hi;
        int c = nums[lo];
        while(i<=gt){
            if(nums[i] < c ){
                exch(nums, i++, lt++);
            }
            else if(nums[i]> c){
                exch(nums, gt--, i);
            }
            else {
                i++;
            }
        }
        quick (nums,lo, lt-1);
        quick(nums,gt+1, hi);
    }
    private void exch(int[] nums, int i, int j){
        int t =nums[i];
        nums[i] = nums[j];
        nums[j] =t;
    }   
}

快排1

  • 首先patittion,

          运用双指针的方法<br />最后交换 flag 与数组后段的下标
    
  • 递归排序左右两边的数组

quick3

  • 选择flag
  • 第一次遍历数组,与flag比较

  • function quick3(arr, lo, hi) {
      let lt = lo,
          i = lo + 1,
          gt = hi;
      if (hi < lo) return;
      let v = arr[lo];
      while (i <= gt) {
          if (arr[i] > v) exch(arr, lt++, i++);
          else if (arr[i] < v) exch(arr, i, gt--);
          else i++;
      }
    
      quick3(arr, lo, lt - 1);
      quick3(arr, gt + 1, hi);
    }