排序算法

  • 0,生成随机数组
  • 1,冒泡排序
  • 2,选择排序
  • 3,插入排序
  • 4,快速排序


0,生成随机数组

利用Random工具类的nextInt()方法生成随机整数。
nextInt()的范围是[0,1),nextInt(100)的范围是[0,100),

//随机数组的生成
private static int[] random(int size){
    int[] arr = new int[size];
    for (int i = 0; i < arr.length; i++) {//遍历数组,生成随机整数
        arr[i] = new Random().nextInt(100);
    }
    return arr;
}

1,冒泡排序

升序排序。
冒泡排序的原理(以递增序为例)是每次从头开始依次比较相邻的两个元素,如果后面一个元素比前一个要大,说明顺序不对,则将它们交换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成。

//1,冒泡排序
private static void method(int[] arr) {
    for (int i = 0; i < arr.length-1; i++) {
        for (int j = 0; j < arr.length-1-i; j++) {
            if (arr[j] > arr[j+1]){//大的往后排
                int x = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = x;
            }
        }
    }
}

2,选择排序

升序排序。
在未排序序列中找到最小元素,存放到排序序列的起始位置.再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕

//2,选择排序
private static void method2(int[] arr){
    for (int i = 0; i < arr.length-1; i++) {
        int k = i;
        for (int j = i+1; j < arr.length; j++) {
            if (arr[j] < arr[k]) {
                k = j;
            }
        }
        int x = arr[i];
        arr[i] = arr[k];
        arr[k] = x;
    }
}

3,插入排序

升序排序。
从第一个元素开始,该元素可以认为已经被排序。取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置 。重复上一步骤,直到找到已排序的元素小于或者等于新元素的位置。将新元素插入到该位置中。继续循环,直到最后一个数插入到有序序列。

//3,插入排序
private static void method3(int[] arr){
    for (int i = 1; i < arr.length; i++) {
        int j = i;
        int temp = arr[i];
        while (j > 0 && arr[j-1] > temp){
            arr[j] = arr[j-1];
            j--;
        }
        arr[j] = temp;
    }
}

4,快速排序

从数列中挑出一个元素,称为“基准”,重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

/**
 *  4快速排序算法
 * @param arr:目标数组
 * @param i:目标数组的排序的开始位置
 * @param j:目标数组的排序的结束位置
 */
public static void method4(int[] arr,int i,int j){
    if (i>=j){//判断需要排序在个数是否大于1
        return;
    }
    int index = arr[i];//定义第一个为标准
    int start = i;//保存起始位置
    int end = j;//保存结束位置
    while (i != j){//总体循环
        while (i != j){//寻找arr[j]小于index循环
            if (arr[j] < index){//当找到小于index的arr[j]时,把他填入arr[i],i右移,跳出循环,arr[j]空出来,继续判断i
                arr[i] = arr[j];
                i++;
                break;
            }
            j--;
        }
        while (i != j){//寻找arr[i]大于index循环
            if (arr[i] > index){//当找到大于index的arr[i]时,把他填入arr[j],j左移,跳出循环,arr[i]空出来,继续判断j
                arr[j] = arr[i];
                j--;
                break;
            }
            i++;
        }
    }//直到找到i==j时,arr[i] ==arr[j] 空出来,
    arr[i] = index;
    method4(arr,start,i-1);
    method4(arr,i+1,end);
}