冒泡排序
1.实现原理
1.每次比较相邻两数
2.小的交换到前面
3.每轮结束后最大的数交换到最后
2.双重循环实现
1.外层循环:比较多少轮
2.内存循环:每轮比较多少次
3.比较或交换:一共比较n(n-1)/2次得到最终结果
3.代码实现
int[] arr = {2,5,8,6,4,1,0,11,6,5};
//外层循环:比较多少轮
for(int i=0;i<arr.length-1;i++) {
//内存循环:每轮比较多少次
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
//升序,如果前一个数比后一个数大,则交换到后面
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
选择排序
1.实现原理
1.循环比较:下标为i的元素依次和之后的所有元素比较,找到本轮最小(大)的元素
2.交换元素:将最小的元素与下标为i的元素交换比较次数:n(n-1)/2
2.代码实现
int array[] = {15,46,21,5,11};
//外层:比较的轮数
for(int i=0; i<array.length; i++) {
int minIndex = i;//最小值的下标每轮开始时初始值为i
//内层:与每一个元素进行比较,找到该轮最小的那一个
for(int j=i; j<array.length; j++) {
//如果发现比array[minIndex]小,则将下标赋给minIndex
if(array[minIndex]>array[j]) {//降序则只需将>修改为<
minIndex = j;
}
}
System.out.println("第"+i+"轮的最小数下标为:"+minIndex);
//将当前元素与本轮最小值替换
int temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
System.out.print("升序排序后:"+Arrays.toString(array));
二分(折半)查找法
1.实现原理
1.定义数组(前提是有序)
2.折半比较:将要查找的元素和数组中间的数比较,没找到则继续折半
2.代码实现
Arrays.sort(array);//升序排序,前提是数组已经排好序
if(num>array[array.length-1] || num<array[0]) {
System.out.print("没有这个数!");
}else if(num==array[array.length-1]){
//middleIndex永远取不到最后一位
System.out.print("已找到!下标为:"+(array.length-1));
}else {
do{
if(num < array[middleIndex]) {
endIndex = middleIndex;
middleIndex = (startIndex + endIndex)/2;
}else if(num == array[middleIndex]) {
System.out.print("找到啦!!"+num+"的下标为:"+middleIndex);
break;//找到则跳出循环
}else {
startIndex = middleIndex;
//这里middleIndex永远取不到最后一个元素,所以将num等于最后一个元素的情况放在if里面
middleIndex = (startIndex + endIndex)/2;
}
}while(true);
}