Java中常见排序算法

1 冒泡排序

排序思路:两两交换,大的放后面,小的放前面

代码实现

复制代码
public static void bubblingSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
复制代码

 

2 选择排序

排序思路:每次循环找出最大值(最小)放在数组末尾。

代码实现

复制代码
public static void selectSort(int[] arr) {
    for (int i = 0; i < arr.length-1; i++) {
        for (int j = i+1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(arr));
}
复制代码

 

 

3 插入排序

排序思路:将一个元素插入到已有序的数组中,在初始时未知是否存在有序的数据,因此将元素第一个元素看成是有序的。与有序的数组进行比较,比它大则直接放入,比它小则移动数组元素的位置,找到个合适的位置插入。当只有一个数时,则不需要插入了,因此需要n-1趟排序

代码实现:

复制代码
/**
 * 插入排序
 * @param arr
 */
public static void insertSort(int[] arr) {
    //临时变量
    int temp;
    //外层循环控制需要排序的趟数(从1开始因为将第0位看成了有序数据)
    for (int i = 1; i < arr.length; i++) {
        temp = arr[i];
        //如果前一位(已排序的数据)比当前数据要大,那么就进入循环比较[参考第二趟排序]
        int j = i - 1;
        while (j >= 0 && arr[j] > temp) {
            //往后退一个位置,让当前数据与之前前位进行比较
            arr[j + 1] = arr[j];
            //不断往前,直到退出循环
            j--;
        }
        //退出了循环说明找到了合适的位置了,将当前数据插入合适的位置中
        arr[j + 1] = temp;
    }
    System.out.println(Arrays.toString(arr));
}
复制代码

 

 

  

4 快速排序

排序思路:在数组中找一个元素(节点),比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。不断执行这个操作….

代码实现:

复制代码
/**
 * 快速排序
 * @param arr
 * @param L   指向数组第一个元素
 * @param R   指向数组最后一个元素
 */
public static void quickSort(int[] arr, int L, int R) {
    int i = L;
    int j = R;
    //支点
    int pivot = arr[(L + R) / 2];
    //左右两端进行扫描,只要两端还没有交替,就一直扫描
    while (i <= j) {
        //寻找直到比支点大的数
        while (pivot > arr[i])
            i++;
        //寻找直到比支点小的数
        while (pivot < arr[j])
            j--;
        //此时已经分别找到了比支点小的数(右边)、比支点大的数(左边),它们进行交换
        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    //上面一个while保证了第一趟排序支点的左边比支点小,支点的右边比支点大了。

    //“左边”再做排序,直到左边剩下一个数(递归出口)
    if (L < j){
        quickSort(arr, L, j);
    }
    //“右边”再做排序,直到右边剩下一个数(递归出口)
    if (i < R){
        quickSort(arr, i, R);
    }
    System.out.println(Arrays.toString(arr));

}
复制代码

 

 

  

posted @   时光巷陌  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示