冒泡排序算法
什么是冒泡排序
我们可以形象的理解为:大小不一的气泡向上浮动,到最后,大的气泡飘到了上面,小的在下面。
无序的排序规则也是这样,每次比较相邻的两个数值,如果之前的数值比后面的数值大,就进行交换,不然就不执行交换,比较下一对,最后,会将遍历出来的最大数值拍到最后
动图演示:---- 动图来源:https://visualgo.net/
对算法进行分析:
- 比较相邻的两个元素,如果前面的币后面的大,则交换
- 对每一对相邻的元素都进行这样的两个数值,如果前面的数值大于后面的数值,就进行交换,这样,最后的元素就是本次遍历完剩下的最大的元素
- 针对所有元素执行上面的步骤,除了已经找到的 最大的元素(可能在序列的末尾)
- 重复以上过程,直到排序结束
冒泡排序代码:
package com.demo;
import java.util.Arrays;
public class Shuzu {
public static void main(String[ ] args) {
int[ ] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };
bubbleSort(values);
System.out.println(Arrays.toString(values));
}
public static void bubbleSort(int[ ] values) {
int temp;
int i;
// 外层循环:n个元素排序,则至多需要n-1趟循环
for (i = 0; i < values.length - 1; i++) {
// 定义一个布尔类型的变量,标记数组是否已达到有序状态
boolean flag = true;
/*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序 数组的最后*/
for (int j = 0; j < values.length - 1 - i; j++) {
// 如果前一个元素大于后一个元素,则交换两元素的值
if (values[j] > values[j + 1]) {
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
//本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;
flag = false;
}
}
//根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
if (flag) {
break;
}
}
}
}
排序结果:
二分法查找
什么是二分法排序?
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元 素从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关 键码(key)比较,如果相等,则检索成功; 否则,若 key 小,则在数组前半部分中继续进行二分法检索; 若 key 大,则在数组后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
实例:
在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到 10 元素,过程如下:
二分法对数组进行排序:
代码:
在数组内找到指定的数值:
package com.demo;
import java.util.Arrays;
public class Shuzu {
public static void main(String[] args) {
int[] arr = {30, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};
int searchWord = 20; // 所要查找的数
Arrays.sort(arr); //二分法查找之前,一定要对数组元素排序
System.out.println(Arrays.toString(arr)); //对数组排序后的结果
System.out.println(searchWord+"元素的索引: "+binarySearch(arr,searchWord));
}
public static int binarySearch(int[ ] array, int value){
int low = 0;
int high = array.length - 1;
while(low <= high){
int middle = (low + high) / 2;
if(value == array[middle]){
return middle; //返回查询到的索引位置
}
if(value > array[middle]){
low = middle + 1;
}
if(value < array[middle]){
high = middle - 1;
}
}
return -1; //上面循环完毕,说明未找到,返回-1
}
}
结果:
对无序数组进行排序
package com.demo;
public class Shuzu {
public static void main(String[] args) {
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1};
for (int i = 1; i < arr.length; i++) {
int temp = arr[i]; //要插入的第i个元素
int low = 0;
int high = i - 1; //插入目标元素的前 i-1 个元素
int mid = -1;
while (low <= high) {
mid = low + (high - low) / 2;
if (arr[mid] > temp) {
high = mid - 1;
} else { // 元素相同时,也插入在后面的位置
low = mid + 1;
}
}
// 目标位置 之后的元素 整体移动一位
for(int j = i - 1; j >= low; j--) {
arr[j + 1] = arr[j];
}
arr[low] = temp;
}
for (int i = 0; i < arr.length ; i++) {
System.out.print(arr[i]+" ");
}
}
}
排序结果:
二分法要点:
使用二分法算法,也可以对数组进行排序
使用二分法进行查找数组的元素时,我们需要先保证,数组的元素是有序的
原理:
每次都在找中间的那个元素,比较大或小就可以减少一半的元素