排序

排序始终是个绕不过去的问题 0.0

归并排序

思路

  • 步骤
    • 划分问题: 把序列分成元素个数尽量相等的两半
    • 递归求解:把两半元素分别排序
    • 合并问题:把连个有序表合并成一个
  • 算法的时间复杂度: O(nlogn) (这个我还没理解)

注意

  • 在上图中,比如说当序列变成 A[i]:38,49,65,97B[j]:13,27,76 并将A和B合并到T中在合并的过程中,都是从A中拿出当前第i个元素和B中第j个元素比较的, 但是到了最后,肯定是某个数组全部的合并到了T中,但是另一个数组中的元素有剩余,这时间,将剩余的元素全部合并到T中(在此例中指的A,因为当B全部进到T中时,A还有97这个元素)

代码

public static void mergeSort(int x,int y){
    if (y-x > 1){
        int m = x + (y-x)/2;
        int p = x;
        int q = m;
        int i = x;
        mergeSort(x, m);
        mergeSort(m, y);
        while (p<m || q<y){
            if (q >=y || (p<m && data[p] <= data[q])){
                 // 这里是左半部分进入数组temp的条件,即要么比右边的元素小,要么右边的元素已经全部进入temp数组
                temp[i++] = data[p++];
            }else{
                temp[i++] = data[q++];
            }
        }
        for ( i=x; i<y; i++){
            data[i] = temp[i];
        }
    }
}

插入排序

思想

  • 其实插入排序就像是打扑克牌:
    • 手里已经有的牌是有序的
    • 当来一种新牌的时候,则从最后一个牌开始比较,慢慢的向前迭代
    • 如果已有的牌比新牌大,则把已有牌往后移动一个位置
    • 如果已有牌不大,则已有牌的后面插入新牌

代码

public int[] insertSort(int[] nums) {
        int j,temp;

        for (int i = 1; i < nums.length; i++) {
            temp = nums[i]; 
            for ( j = i; j > 0 && temp > nums[j-1]; j--) {
                nums[j] = nums[j-1]; 
            }

            nums[j] = temp;
        }
        return nums;
    }

快排

代码

这个算法真是个激动人心的算法

冒泡排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值