Java学习之旅(五)

Java学习之旅(五)

第三周Java学习重点总结(1)

  1. 冒泡排序
  2. 选择排序
  3. 插入排序

1.冒泡排序
让数组当中相邻的两个数进行比较,数组当中比较小的数值向左移,数值比较大的向右移!外层for循环控制循环次数,内层for循环控制相邻的两个元素进行比较。

在这里插入图片描述例如:
用随机整数生成一个长度为10的数组并排序,数组的值各不相同(1-100),并且计算循环了多少次,交换了多少次,耗时。

 Random rand = new Random();
        int[] array = new int[10];
        int size = 0;        //size代表下标
        array[size++]= 1+rand.nextInt(100);  //得到随机整数

        boolean no;                       //验证模型:
        for (int t; size <array.length ; ) {
            t = 1+rand.nextInt(100);   //
            no = true;               // 假设数组里的没有重复值,验证数组里面有,
            for (int j = 0; j <size ; j++) {
                if (array[j]==t){
                    no = false;
                    break;
                }
            }
            if (no){
                array[size++] = t;
            }
        }

//        System.out.println("排序前:");
//        for (int i : array) {
//            System.out.println(i);
//        }

        long circleCount = 0,swapCount = 0;
        long begin = System.currentTimeMillis();
//  外层循环控制多少轮
 for (int i = 0,t; i <array.length-1 ; i++,circleCount++) {
//  内层循环控制每一轮比较多少次,找左边大的
      for (int j = 0; j < array.length-1-i; j++,circleCount++) {
     	  if (array[j]>array[j+1]){
                    t=array[j];
                    array[j] = array[j+1];
                  array[j+1] = t;
                   swapCount++;
               }
          }
     }
     System.out.println("排序后:");
            for (int a : array) {
                System.out.println(a);
            }
  
   System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
        circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));
        

输出结果为:
在这里插入图片描述
2.选择排序
选择排序就是每次从一组待排序的数组中找到最小值(或最大值)然后与该序列的起始位置进行替换,以此类推,直到待排序的数组排序好为止。在这里插入图片描述
例如:上题用选择排序

for (int i = 0,maxValIx,maxIx,t; i <array.length-1 ; i++,circleCount++) {
    maxValIx = 0;// 假设最大值下标为0,并通过内层循环进程验证调整
    maxIx = array.length-1-i;//最大下标在每一轮是固定的
    for (int j = 1; j <= maxIx; j++,circleCount++) {
        if (array[maxValIx]<array[j]){
            maxValIx = j;
        }
    }
    // 判断最大值是否出现在最大下标,若不是则值交换
    if (maxValIx != maxIx){
        t = array[maxValIx];
        array[maxValIx] = array[maxIx];
        array[maxIx] = t;
        swapCount++;
    }
}
System.out.println("排序后:");
for (int i : array) {
    System.out.println(i);
}
 System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
        circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));

输出结果为:
在这里插入图片描述
选择排序相较于冒泡排序,值交换的次数少了不少,效率更高,更能节省成本。

3.插入排序
插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
在这里插入图片描述
例如:上题用插入排序

for (int i = 1,t,j; i < array.length; i++,circleCount++) {
     //   先拿i和i-1 位置上的值比较,如果i位置上的值大,则自然成序
     if (array[i]>=array[i-1]){
         continue;
     }
     //   用临时变量存储i位置的值
     t = array[i];
     //挪位置
     for (j = i-1; j>=0 && t < array[j]; j--,circleCount++,swapCount++) {
        array[j+1] = array[j];
     }
     //插
     array[j+1] = t;
 }


 System.out.println("排序后:");
 for (int i : array) {
     System.out.println(i);
 }

 System.out.println(MessageFormat.format("循环{0}次,值交换{1}次,耗时{2}秒",
         circleCount,swapCount,(System.currentTimeMillis()-begin)/1000.0));

输出结果为:
在这里插入图片描述
从输出结果看,插入排序相较于冒泡排序和选择排序,循环最少,耗时最少,效率更好。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值