排序方法(冒泡、选择)

1、冒泡排序

冒泡排序:
   每次取出相邻的两个元素进行比较,把较大的向后移动

先以一个数组讲解一下,然后再写代码:
      待排序数组:3,9,-1,10,20
       第一轮排序:
        (1)3,9,-1,10,20      ----3跟9比较,不交换

        (2)3,-1,9,10,20      ----9比 -1大,所以9跟 -1交换

        (3)3,-1,9,10,20      ----9跟10比较,不交换

        (4)3,-1,9,10,20      ----10跟20比较,不交换

           第一轮过后,将20这个最大的元素固定到了最后的位置

       第二轮排序:
            因为20的位置已经固定,所以只对前4个进行排序即可:

        (1)-1,3,9,10,20      ----3比 -1大,进行交换

        (2)-1,3,9,10,20      ----3跟9比较,不交换

        (3)-1,3,9,10,20      ----9跟10比较,不交换

            第二轮过后,将第二大的元素固定到了倒数第二个位置

       第三轮排序:
            10和20的位置已经确定,只需对前三个进行排序

        (1)-1,3,9,10,20      ----3和-1比较,不交换

        (2)-1,3,9,10,20      ----3和9比较,不交换

            第三轮过后,将第三大的元素位置确定

       第四轮排序:
            只对前两个元素进行排序

        (1)-1,3,9,10,20      ----3和-1比较,不交换

       第四轮过后,将第四大的元素位置确定,此时总共5个元素,已经排序好4个,从而最后一个自然而然就是排好序的了

小结:
设总的元素个数为n,那么由上边的排序过程可以看出:

(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环

(2)每轮排序比较的次数逐轮减少

(3)如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。(详见下边优化部分)

代码实现


 
        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 temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            
          

2、选择排序

选择排序:
   假设第一个元素就是最小值(或最大值),用第一个位置上的元素与后面没一个位置上的元素进行比较,
   满足条件 交换位置

  从待排序的n个数据中,每一趟在n-i+1个元素中选择值最小的元素作为有序序列中的第i个元素,从而达到排序的目的。

    简单说就是:第一趟:在n个元素中选择最小的元素与待排序数列的第一个元素交换

                         第二趟:在第2~n个元素中选择最小的元素与待排序数列的第二个元素交换

                         第三趟:在第3~n个元素中选择最小的元素与待排序数列的第三个元素交换

                         ……


    小结:
      1、可以发现n个元素共需要进行n-1趟排序就可完成,因为前n-1个元素确定好位置之后,最后一个自然而然就确定好了位置

      2、当选择出了最小的元素之后,若发现其就已经处于将要放置的位置时,则可以不用交换
代码实现

for(int i=0;i<c.length-1;i++){
            for(int j=i+1;j<c.length;j++){
                if(c[i]>c[j]){
                    int temp=c[i];
                    c[i]=c[j];
                    c[j]=temp;
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值