1 冒泡排序 :
public static void main(String[] args) { //test1(); //System.out.println(factorial(5)); int[] value = {3,1,6,2,9}; sort(value); } /** i = 0 j = 0[1, 3, 6, 2, 9] i = 0 j = 1[1, 3, 6, 2, 9] i = 0 j = 2[1, 3, 2, 6, 9] i = 0 j = 3[1, 3, 2, 6, 9] i = 1 j = 0[1, 3, 2, 6, 9] i = 1 j = 1[1, 2, 3, 6, 9] i = 1 j = 2[1, 2, 3, 6, 9] i = 2 j = 0[1, 2, 3, 6, 9] i = 2 j = 1[1, 2, 3, 6, 9] i = 3 j = 0[1, 2, 3, 6, 9] * @param value */ private static void sort(int[] value) { int temp ; for(int i=0; i<value.length; i++){ // 趟数 for(int j=0; j<value.length -1 - i; j++ ){数组内元素比较次数 // 内循环比较 每一次内循环比较结束后 都会讲最大/小 放在数组最右侧 下次内循环时,最右侧的这个值直接排除比较,这就是value.length -1 - i的缘由 // 在内循环下 两两比较 两两比较中得到最大/小值,然后在内循环的下一个j赋值过来后 这个最大/最小值在和数组下一个值比较和互换 最终在整个内循环一次 eg i=0 j=0,内循环结束后 将最大/最小值冒泡到数组最右侧位置 if(value[j] > value[j+1]){ temp = value[j]; value[j] = value[j+1]; value[j+1] = temp; } System.out.print(" i = " + i + " j = " + j); System.out.print(Arrays.toString(value)); System.out.println(""); } } }
附图是冒泡的别的数据例子,只是表示 趟数和次数的关系:
上面版本是 趟数固定,减少次数比较。
如下是 冒泡排序 减少 趟数写法:
package beijing.lele; import java.util.Arrays; public class Sort { public static void main(String[] args) { int[] arrs = {4,1,2,3}; sort(arrs) ; sortFinal(arrs); System.out.println(Arrays.toString(arrs)); } /** 只是减少每趟下比较次数,这样会增加多余趟数的循环,这里循环了三趟 this is the 0趟; [1, 4, 2, 3] [1, 2, 4, 3] [1, 2, 3, 4] this is the 1趟; [1, 2, 3, 4] [1, 2, 3, 4] this is the 2趟; [1, 2, 3, 4] [1, 2, 3, 4] * @param arrs */ public static void sort(int[] arrs) { for(int i=0; i<arrs.length-1; i++) { System.out.println("this is the " + i + "趟;"); for(int j=0; j<arrs.length-1-i; j++) { int tmp; if(arrs[j] > arrs[j+1]) { tmp = arrs[j+1]; arrs[j+1] = arrs[j]; arrs[j] = tmp; } System.out.println(Arrays.toString(arrs)); } } } /** 这里只会循环2趟, this is the 0趟; [1, 4, 2, 3] [1, 2, 4, 3] [1, 2, 3, 4] [1, 2, 3, 4] this is the 1趟; [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] * @param arr */ public static void sortFinal(int[] arr){ boolean sorted= true; int len =arr.length; for(int j=0;j<len-1;j++){ //趟数 sorted =true; //假定有序 System.out.println("this is the " + j + "趟;"); for(int i=0;i<len-1-j;i++){ //次数 if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] =arr[i+1]; arr[i+1] =temp; sorted =false; //假定失败 } System.out.println(Arrays.toString(arr)); } System.out.println(Arrays.toString(arr)); if(sorted){ //上面这一趟比较下来,如果没有互换位置的,那么就终止下一趟的比较 break; } } } }
2 二分法查找 : node(int index)