• 基本排序


    引用某人的话:算法是区别码农与软件工程师的依据,编程从来都是脑力工作,只是多数人把它干成了体力活。算法提供的是一种思路,一种思维方式,实现同样的功能,有人能用几行代码你却要用几十行代码,为什么别人的程序代码量少、运行效率高且bug少,你的代码杂乱无章、效率越来越差、bug不好找。

     冒泡排序

    虽然复习了几次冒泡排序,但是过一段时间后又忘记了,还是因为没有真正理解到算法的思想,今天独立实现了冒泡排序,用自己的语言记录下来,加深自己的理解。

    题目:有一个int类型的数组,需要你将数组从小到大进行排序

    思考过程:

    1、先写一个五个元素的数组,自己手动排序,分析一下思路;

    (编程不是一行一行往下写的,先把思路理出来了,把大的框架(逻辑)写出来,然后填空,重要的不是用什么语言,只要能写出关键逻辑就是高手,这就是有开发经验与实习生的区别);

    2、开始编码

     1 public class OrderNum {
     2     public static void main(String[] args) {
     3         // TODO Auto-generated method stub
     4         int[] data = {3,2,8,0,4,5,1,9,6,7};
     5         for(int m=data.length-1 ;m>0 ;m--){
     6             for(int n=0;n<m;n++){ //这里n的边界用m做判断,因为没经过一轮外循环,最大的数已经确定下来,就不用再进行比较了;如果用n<data.length还会越界
     7                 if(data[n]>data[n+1]){
     8                     int temp = data[n+1];
     9                     data[n+1] = data[n];
    10                     data[n] = temp;
    11                 }
    12             }
    13         }
    14         for(int i : data){
    15             System.out.print(i+"   ");
    16         }
    17         
    18     }
    19 }

    输出:

    另外一种写法:

    思想是一样的:相邻两个数比较,将最小或最大的放到后面,最后面数的不参与比较;

    思路:两两比较这是一个循环(属于内循环,也就是里面那个for里要实现的),比较完一轮之后最大的数就到最后一位了,然后在继续两两比较,这是第一层循环也就是第一层for里面的写法。

    编码实现:

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] array = {2,1,5,3,8,6,4,0};
            for(int i=0;i<array.length;i++){  // 最后在看这里, 第一层循环:有多少个数,两两比较多少次
                for(int j=0;j<array.length-i-1;j++){  //再理解这里,第二层循环:从第一个数开始两两比较,直到比较完一轮,为不让数组溢出因此j的范围需要-1;
                    if(array[j]>array[j+1]){  //先理解这里,比较两个数,大的往后放
                        int temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp ;
                    }
                }
            }
            for(int m :array){
                System.out.print(m+"	");
            }
        }

    上面代码中,交互两个数还有一种方法:可以不另外申请额外的变量就可以交换:

    例如: a  b 

    交换公式:

    a = a + b;  

    b = a - b;  ( 此时a = a+b ,所以 b = a - b = a + b - b = a)

    a = a - b;  ( 此时a = a+b ,b = a ,所以 a = a + b - a = b )

    例如: a = 5 , b = 3 ;

    a = 5 + 3 = 8;

    b = a - b = 8 - 3 = 5;

    a = a - b = 8 - 5 = 3;


    插入排序

    思路:

      1、从第一个元素开始,该元素可以认为已经被排序;

      2、取出下一个元素,在已经排序的元素序列中从后向前扫描;

      3、如果该元素(已排序)大于新元素,将该元素往后移一位;

      4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置中;

      5、重复步骤2;

    public class Temp {
        public static void main(String[] args) {
    
            int[] numbers = new int[] { 5, 1, 2, 0, 4, 3, 6 };
            int size = numbers.length, temp, j;
            for (int i = 1; i < size; i++) { //把数组第一个元素当作已经排好序的,从数组第二个元素开始进行比较
                temp = numbers[i];  //把取出来的数临时存放起来
                for (j = i; j > 0 && temp < numbers[j - 1]; j--) //对已排序的从后向前扫描,大于新元素的往后放
                    numbers[j] = numbers[j - 1];
                numbers[j] = temp; //否则就将新元素插入到小于或等于新元素的位置
            }
    
            for (int m : numbers) {
                System.out.print(m + "	");
            }
        }
    }

  • 相关阅读:
    团队项目第一阶段冲刺站立会议(5月10日)
    团队项目第一阶段冲刺站立会议(5月9日)
    团队项目第一阶段冲刺站立会议(5月7日)
    课堂练习之找数字0-N中“1”出现的次数
    团队开发项目-----来用------项目风险分析
    《你的灯亮着吗》阅读笔记之第五篇与第六篇
    《你的灯亮着吗》阅读笔记之第三篇与第四篇
    《你的灯亮着吗》阅读笔记之第一篇与第二篇
    课堂练习之检测水军(拓展)
    课后作业之输入法评价
  • 原文地址:https://www.cnblogs.com/crazytrip/p/7008378.html
Copyright © 2020-2023  润新知