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