快速排序、插入排序、选择排序和冒泡排序的实现

冒泡排序

初遇:
冒泡排序,正如它的名字,一个泡泡由小变大,从下至上冒出来。
算法描述:
从最底部的两个数做比较,如果下面的比上面的大,则交换位置(这里我们默认排序后为:小->大)。一次循环完成后,最大的就到了最上方的位置,所以在下次循环的时候只需要到总个数减1的地方即可。
代码实现:
public static void bubbleSort(int datas[]){
    int j = 0;//趟数
    int i = 0;//每次冒泡的比较次数
    for(j=0; j<datas.length; j++){
        for(i=0; i<datas.length-1-j; i++){
            if(datas[i]>datas[i+1]){
                int temp = datas[i];
                datas[i] = datas[i+1];
                datas[i+1] = temp;
            }
        }
    }
}
个人总结:
最初自己在写冒泡的时候很容易和选择排序搞混淆,感觉代码长得都差不多。但是后来理解了一下,貌似清晰了不少,虽然还是会忘。。。

选择排序

初遇:
感觉选择排序最简单,考试让写冒泡排序来着,后来写成了选择排序。。。┑( ̄Д  ̄)┍ 怪我咯
算法描述:
自己的理解:选择排序就是先把第一个拿起来,记住他的下标,然后依次和后面的做比较,如果遇到比你拿起来的还小,就记住它的下标,一圈以后,就找到了最小的值的下标,然后把拿起来那个和最小的交换。然后换第二个开始比较,每次比较的次数都在上一次的基础上少了1次。
代码实现:
public static void selectSort(int datas[]){
    int j = 0;//记录趟数
    int i = 0;//记录比较次数
    for(j=0; j<datas.length; j++){
        int minIndex = j;//把它当作最小的值
        for(i=j+1; i<datas.length; i++){
            if(datas[minIndex] > datas[i]){
                minIndex = i;
            }
        }
        //一趟比较完成后,交换位置
        int temp = datas[j];
        datas[j] = datas[minIndex];
        datas[minIndex] = temp;
    }
}

插入排序

算法描述:
插入排序是取得待排序数组的第二个值,然后和第一个比较,如果第一个比较大,就将前面的往后移动一位,当前面已经没有数字的时候,将取得的值放在空出的位置上。
代码实现:
public static void quickSort(int datas[]){
    int j = 0;
    int i = 0;
    for(j=1; j<datas.length; j++){
        int temp = datas[j];
        for(i=j-1; i>=0; i--){
            if(datas[i]>temp){
                datas[i+1] = datas[i];//往后移动一位
            }else{
                break;//因为是从前面开始排的,所以如果有一个小于temp,前面的都小于temp
            }
        }
        datas[i+1] = temp;
    }
}

快速排序

代码实现:
public static void quickSort(int[] datas, int left, int right){
    int midd = 0;//记录中间的位置
    if(left < right){
        midd = partition(datas, left, right);
        quickSort(datas, left, midd-1);
        quickSort(datas, midd+1, right);
    }
}

public static int partition(int[] datas, int left, int right){
    int pivot = datas[left];
    while(left < right){
        while(left < right && datas[right] >= pivot){
            right--;
        }
        if(left < right){
            datas[left] = datas[right];
            left++;
        }
        while(left < right && datas[left] <= pivot){
            left++;
        }
        if(left < right){
            datas[right] = datas[left];
            right--;
        }
    }
    datas[left] = pivot;
    return left;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值