冒泡、选择排序,与二分法查找 全网最详细!!!!!
话接上文,数组除了一维数组、二维数组,其实还有关于他们的算法
详解冒泡排序:
int[] arr1= {100, 4, 5, 12, 3};
int temp;
//冒泡排序,第一种格式
for(int i = 0; i <arr1.length; i++) {
for(int j = 0; j < arr1.length - i - 1; j++) {
if(arr1[j] > arr1[j+1]) {
temp = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = temp;
}
}
}
//冒泡排序,第二种格式
for(int i = arr1.length; i > 0; i--) {
for(int j = 0; j < i- 1; j++) {
if(arr1[j] > arr1[j+1]) {
temp = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = temp;
}
}
}
详解选择排序:
选择排序跟冒泡排序相比,执行效率高,每一次的排序都是由意义
循环一次,然后找出参加比较中这堆数据中最小的,拿着这个最小的值和前面的数据交换位置。
//选择排序,第一种格式
for(int i = 0; i < arr1.length - 1; i++) {
int min = i;
for(int j = i; j <arr1.length- i ;j++) {
//如果有比最小值还小的数字,把两者下标交换
if(arr1[j] < arr1[min]) {
min = j;
}
}
//如果min与i不相等,就把min与i交换。这时候的min就是内循环里面的j
if(min!=i) {
temp = arr1[min];
arr1[min] = arr1[i];
arr1[i] = temp;
}
}
详解二分法查找:
二分法查找的基本盘是建立再已经排序的情况下
二分法的查找效率是远远高于"一个挨着一个"这种查找效率
二分法的查找原理是什么:
假设有一个int类型的数组1(0下标) , 4 , 8 , 100 , 200(4下标)
目标,找出200的下标(0+4) / 2 = 2
-->说明下标为2的是中间值
8 < 100 下标递增1 ——> 2+1 = 3
(3+4) / 2 = 3
-->说明下标为3的是中间值
100 < 200 下标递增1 ——> 3+1 = 4
(4+4) / 2 = 4
-->说明下标为4的是中间值
200 !<200 说明找到了目标数值
二分法的代码:
int begin = 0; //这个意思就是定义一个开始的值,可以通过方法传递实参进来赋值
int end = arr.length -1;//同上,为什么要减去1,因为下标是从0开始的
int mid;//定义一个中间的值
mid = (end + begin) / 2;//这就是中间的值的定义
while(begin<=end){
if(arr[mid] == dest){//如果中间的值等于目标值的话,返回中间值的下标;
return mid;
}
else if(arr[mid] < dest){
begin = mid + 1; //这个表示开始的值等于中间值加1,中间的值是需要发生变化的
}
else{
//目标如果在中间值的左边,需要修改中间值
//这个代表的情况是"arr[mid] > dest"
end = mid - 1;
}
}