常见的排序算法(上)

常见的几个排序算法:
1.冒泡排序
2.选择排序
3.插入排序
4.希尔排序
5.快速排序
当然除了这几个排序算法还有很多排序算法,今天就着重了解这些算法

冒泡排序

冒泡排序是一种比较简单的排序,通过两个元素对比,元素顺序错了就把位置调换过来,直到不再交换位置,排序完成

 private static String bubbleSort(int[] arr) {
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            for (int j = 0; j < length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {//前一位大于后一位
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return Arrays.toString(arr);
    }

选择排序

选择排序是一种比较好理解的算法,他的思想就是在遍历的过程当中,找到最小的值,放到起始的位置,然后继续在剩余的元素里找到最小的值,元素交换,直到结束

    private static String selectSort(int[] arr) {
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            int index = i;
            for (int j = i + 1; j < length; j++) {
                if (arr[j] < arr[index]) {
                    index = j;
                }
            }
            // 最小元素与当前的i互换
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        return Arrays.toString(arr);
    }

插入排序

插入排序是一种比较稳定的排序算法,这个算法的思想就是每一步将待排序的元素记录,然后插入到前面的有序的序列中,直到插完所有的元素为止

    private static String insertSort(int[] arr) {
        int length = arr.length;
        for (int i = 0; i < length - 1; i++) {
            //定义待插元素
            int value = arr[i+1];
            int j = i;
            for (;j>=0 && arr[j] > value;j--){
                arr[j+1] = arr[j];
            }
            arr[j+1] = value;
        }
        return Arrays.toString(arr);
    }

首先定义一个待插元素,然后与他的前一位进行比较,如果前一位大于后一位,那么就那么就将前一位后移,再把待插元素放到前一位,然后继续重复该步骤,直到结束

希尔排序

希尔排序采用了分治法的思想,首先定义一个增量,将所有元素按照增量分组,然后每组使用插入排序进行排序,接着缩小增量,每组再继续使用插入排序进行排序,直到增量变为1,整个元素也就变成了一组元素。

    private static String shellSort(int[] arr) {
        int length = arr.length;
        for (int gap = length / 2; gap > 0; gap /= 2) {//gap = gap / 2
            for (int i = gap; i < length; i++) {
                for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap) {//j = j - gap
                    int temp = arr[j];
                    arr[j] = arr[j + gap];
                    arr[j + gap] = temp;
                }
            }
        }
        return Arrays.toString(arr);
    }

定义增量为数组长度的二分之一,假如数组长度为10,那么增量就为5,第1位元素和第6(5+1)位元素为一组,以此类推,然后每组进行插入排序,

快速排序

快速排序的思路大致为先确定一个基准数,然后所有比他小的元素都放在他的左边,所有比他大的元素都放在他的右边,然后接着对两边的数据进行快速排序,这个过程可以递归进行,直到达到有序

    private static String quickSort(int[] arr, int left, int right) {
        int l = left;// 左
        int r = right;// 右
        int mid= arr[(left + right) / 2];// 找到中间的值
        // 将比pivot小的值放在其左边,比pivot大的值放在其右边
        while (l < r) {
            while (arr[l] < mid) {
                l += 1;// 将l右移一位
            }
            while (arr[r] > mid) {
                r -= 1;// 将r左移一位
            }
            if (l >= r) {
                break;
            }
            // 交换元素
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            
            if (arr[l] == mid) {
                r -= 1;
            }
            if (arr[r] == mid) {
                l += 1;
            }
        }
        
        if (l == r) {
            l += 1;
            r -= 1;
        }
        // 向左递归
        if (left < r) {
            quickSort(arr, left, r);
        }
        // 向右递归
        if (right > l) {
            quickSort(arr, l, right);
        }
        return Arrays.toString(arr);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值