三种常用的排序方法(冒泡/选择/快速)

1、冒泡排序(Bubble Sort)O(n²)

/**
* 1.比较相邻两个数据如果。第一个比第二个大,就交换两个数
*
* 2.对每一个相邻的数做同样1的工作,这样从开始一队到结尾一队在最后的数就是最大的数。
*
* 3.针对所有元素上面的操作,除了最后一个。
*
* 4.重复1~3步骤,知道顺序完成。
*/

//外圈从0到n-1

for(int i=0;i<arr.length-1;i++){

  //内循环从1到n
  for(int j=i+1;j<arr.length;j++){

    //每次对比两数,a>b交换,保持右边大于左边
    if(arr[i]>arr[j]){
      int temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
  }
}

 

2.选择排序(SelectSrot)O(n²)

/**
* 1.在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。
*
* 2.第二次从下一个数开始遍历 n-2 个数,找到最小的数和第二个数交换。
*
* 3.重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。
*/

for(int i = 0;i<arr.length-1;i++){
  //记录第一个数的索引
  int min = i;
  //从1开始判断下个数时候小于最小数,若小于则最小索引置为此数
  for(int j = i+1;j<arr.length;j++){
    if(arr[j]<arr[min]){
      min = j;
    }
  }
  //将得到的最小数与第一个数交换
  int temp = arr[i];
  arr[i] = arr[min];
  arr[min] = temp;
}

3.//快速排序(QuickSort)O (nlogn)

/**
* 二分思想
* 1.取数组第一个数arr[0]为基准数,记录此值
* 2.从arr[1]向右判断是否比基准数大,取第一个出现的数
* 从arr[arr.length-1]向左判断是否比基准数小,取第一个出现的数
* 3.判断2中两个数的index,i是否大于j,若i<j则两数交换
* 4.第一轮结束后,将基准数和重复1-3步骤操作
*/

private static void quickSort(int[] arr,int low,int high) {
  if(low>high){
    return;
  }
  int temp = arr[low];
  int i = low;
  int j = high;
  while(i<j){
    //!先从右向左判断,找到一个比基准数小的数
    while(temp<=arr[j]&&i<j){
      j--;
    }
    //从左到右判断,找到一个比基准数大的数
    while(temp>=arr[i]&&i<j){
      i++;
    }
    //判断两数索引大小
    if(i<j){
      int c = arr[i];
      arr[i] = arr[j];
      arr[j] = c;
    }
  }
  //将基准数与排序后的左半段索引交换
  arr[low] = arr[i];
  arr[i] = temp;
  //递归将左右两段继续排序
  quickSort(arr, low, j-1);
  quickSort(arr, j+1, arr.length-1);
}

排序速度:快速 > 选择 > 冒泡

 

posted @ 2020-02-22 17:47  Covenant  阅读(1117)  评论(0编辑  收藏  举报

ヾ(≧O≦)〃点我返回顶部嗷~