JAVA集合类(2):冒泡排序、二分查找
以下各种排序都是使用数组实现的。
?
1,冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
?
package com.test.array;public class BubbleSortTest {public static void main(String[] args) {int[] array = {7,2,9,4,5};bubbleSort(array);}public static void bubbleSort(int[] array){for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length-i-1; j++) {if(array[j] > array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}System.out.println("第"+i+1+"趟排序结果");for (int k = 0; k < array.length; k++) {System.out.print(array[k]+" ");}System.out.println();}}}最后输出结果为
第01趟排序结果2 7 4 5 9 第11趟排序结果2 4 5 7 9 第21趟排序结果2 4 5 7 9 第31趟排序结果2 4 5 7 9 第41趟排序结果2 4 5 7 9
??
?
?
2,二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
?
package com.test.array;public class ArraySearchTest {public static void main(String[] args) {int[] array = {1,3,6,8,11,18};int value = 11;int index = binarySearch(array, value);System.out.println(index);}public static int binarySearch(int[] array, int value) {int low = 0;int high = array.length - 1;int middle;while (low <= high) {middle = (low + high) / 2;if (array[middle] == value) {return middle;}if (value < array[middle]) {high = middle - 1;}if (value > array[middle]) {low = middle + 1;}}return -1;}}?
?
3,生成随机数排序测试:
随机生成50个数字(整数),每个数字的范围是【10,50】,统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来。如果某个出现的次数是0,则不打印它。打印时按照数字的升序排列。
package com.test.array;import java.util.Random;public class RandomTest {public static void main(String[] args) {Random random = new Random();int[] count = new int[41]; //【10,50】有41个数字//生成50个从10到50的随机数for (int i = 0; i < 50; i++) {//nextInt返回的是大于等于0,小于界限值的整数值,例如下面的nextInt(41)将返回0到40的整数int number = random.nextInt(41)+10;count[number - 10]++; //记录出现的次数}int maxTimes = 0;int maxTimesValue = 0;//打印结果for (int i = 0; i < count.length; i++) {if (count[i] == 0) {continue;}System.out.println((10+i)+"出现次数:"+count[i]);if(maxTimes < count[i]){maxTimes = count[i];maxTimesValue = i +10;}}System.out.println("最大次数是:"+maxTimes+"次,数字是:"+maxTimesValue);}}?
?
?