Java 常用算法(冒泡、选择、插入、快排)

1. 冒泡排序的实现

冒泡排序是所有排序算法中最基本、最简单的一种。思想就是交换排序,通过比较和交换相邻的数据来达到排序的目的。

设数组的长度为N: 

  1、比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。

  2、这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

  3、N=N-1,如果N不为0就重复前面二步,否则排序完成。

按照这个定义很快就能写出代码:

public static void sort(int[] arr){
  int n = arr.length;
  for (int i = 0; i < n; i++) {
    for (int j = 1; j < n-i; j++) {
      if(arr[j-1] > arr[j]){
        int temp = arr[j-1];
        arr[j-1] = arr[j];
        arr[j] = temp;
      }
    }
  }
}

2. 选择排序的实现

选择排序算法在每一步中选取最小值来重新排序,通过选择和交换来实现排序。
  具体流程如下:
  1、首先从原数组中选择最小的1个数据,将其置于第一个位置。
  2、然后从剩下的数据中再选择其中最小的一个数据,并将其置于原数组的第二个位置。
  3、不断重复选择和交换的过程,直至最后排序完成。

public static void sort(int[] arr){
  int temp ;
  int small;
  for (int i = 0; i < arr.length; i++) {
    small = i;
    //找出最小数的下标
    for (int j = i+1; j < arr.length; j++) {
      if(arr[j] < arr[small]){
        small = j;
      }
    }
    //交换
    if(small != i){
      temp = arr[i];
      arr[i] = arr[small];
      arr[small] = temp;
    }
  }
}

3. 插入排序的实现

直接插入排序是将未排序的数据插入至已排好序序列的合适位置。
  具体流程如下:
  1、首先比较数组的前两个数据,并排序;
  2、比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
  3、比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
   ......
  4、直至把最后一个元素放入适当的位置。
public static void sort(int[] arr){

  int temp ;
  for (int i = 1; i < arr.length; i++) {
    //待插入的数据
    temp = arr[i];
    int j;
    for (j = i-1; j >= 0; j--) {
      //判断是否大于 temp, 大于则后移
      if(arr[j] > temp){
        arr[j+1] = arr[j];
      }else{
        break;
      }
    }
    arr[j+1] = temp;
  }
}

4. 快速排序的实现

快速排序,顾名思义,是一种速度快,效率高的排序算法。

快排原理:
        在要排的数(比如数组A)中选择一个中心值key(比如A[0]),通过一趟排序将数组A分成两部分,其中以key为中心,key右边都比key大,key左边的都key小,然后对这两部分分别重复这个过程,直到整个有序。
        整个快排的过程就简化为了一趟排序的过程,然后递归调用就行了。
        一趟排序的方法:
1、定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标
2、从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3、从数组的第一个数Ai 从左往右找,找到第一个大于key的数,记为Ai;
4、交换Ai 和Aj 
5、重复这个过程,直到 i=j
6、调整key的位置,把A[i] 和key交换
 

public static void sort(int arr[],int low,int high){
  //1. 找到程序的出口
  if( low > high){
    return;
  }
  //2. 存
  int i = low;
  int j = high;
  //3. key
  int key = arr[i];
  //4. 完成一次比较
  while(i < j){
    //4.1 从右边找到一个小于key的数
    while(i<j && arr[j] > key){
      j--;
    }  
    // 4.2 从左边找到一个大于key的数
    while(i<j && arr[i] <= key){
      i++;
    }
    //4.3 交换
    if(i<j){
      int p = arr[i];
      arr[i] = arr[j];
      arr[j] = p;
    }
  }
  //4.4 跳转key 的位置
  int p = arr[i];
  arr[i] = arr[low];
  arr[low] = p;
  //5. 对 key 左边的数据快速排序
  sort(arr,low,i-1);
  //6. 对 key 右边的数据快速排序
  sort(arr,i+1,high);
}

猜你喜欢

转载自www.cnblogs.com/baishiming/p/9132684.html