1选择排序 * int[] arr = {66,55,44,33,22,11}; 原理:如果拿0角标上的元素依次和后面的元素进行比较, 第一次内循环结束后,最小值出现在了0角标位置。 arr[0]与arr[1-5]比了五次 arr[1]与arr[2-5]比了四次 arr[2]与arr[3-5]比了三次 arr[3]与arr[4-5]比了二次 arr[4]与arr[5]比了一次 你就想想我们是如何打星星 ***** **** *** ** * arr[x]与arr[y]比较 数组长度是6 for (int x = 0;x < arr.length - 1;x++){ for (int y = x + 1;y < arr.length;y++){ if (arr[x] > arr[y]){ int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } * 2冒泡排序 int[] arr = {66,55,44,33,22,11}; 原理:两个相邻元素进行比较,第一次比较完以后,最大值出现在了最大角标处。 第一次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3],arr[3]与arr[4],arr[4]与arr[5],比了五次 第二次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3],arr[3]与arr[4]比了四次 第三次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3]比了三次 第四次:arr[0]与arr[1],arr[1]与arr[2]比了二次 第五次:arr[0]与arr[1]比了一次 for (int x = 0;x < arr.length - 1; x++){ //-1防止角标越界 //-x为了提高效率 for (int y = 0;y < arr.length - 1 - x;y++){//6 if (arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } * 3,查找 * A:无序数组 * int[] arr = {33,22,11,44,55,66}; public static int getIndex(int[] arr,int key) { for (int x = 0;x < arr.length;x++){ if (key == arr[x]){ return x; } } return -1; } * B:有序数组 二分查找 * 数组长度是6,最大角标值是5 public static int getIndex(int[] arr,int key) { int min = 0; int max = arr.length-1; int mid = (min + max)/2; while (key != arr[mid]){ if (key > arr[mid]){ min = mid + 1; }else if (key < arr[mid]){ max = mid - 1; } if (min > max){ return -1; } mid = (min + max)/2; } return mid; } |