基本排序

引用某人的话:算法是区别码农与软件工程师的依据,编程从来都是脑力工作,只是多数人把它干成了体力活。算法提供的是一种思路,一种思维方式,实现同样的功能,有人能用几行代码你却要用几十行代码,为什么别人的程序代码量少、运行效率高且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 + "	");
        }
    }
}

原文地址:https://www.cnblogs.com/crazytrip/p/7008378.html