冒泡排序
冒泡(Bubble Sort)排序是一种简单排序算法,它通过依次比较交换两个相邻元素实现功能。每一次冒泡会让至少一个元素移动到它应该在的位置上,这样 n 次冒泡就完成了 n 个数据的排序工作。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序算法实现步骤:
- 比较相邻的元素,如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素重复上述工作,从第一对到最后一对。完成后,最大的数会放到最后位置。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序过程具体见下图:
package com.briup.chap04;
import java.util.Arrays;
public class Test06_Sort {
public static void main(String[] args) {
int[] array = {4,5,3,2,1};
//排序
bubbleSort(array);
//遍历
System.out.println(Arrays.toString(array));
}
//冒泡排序
public static void bubbleSort(int[] arr) {
//每次排序,可以将 未排序序列中 最大值 放到最后位置
//len个成员,一共排序len-1次即可
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]) {
arr[j] = arr[j] ^ arr[j+1];
arr[j+1] = arr[j] ^ arr[j+1];
arr[j] = arr[j] ^ arr[j+1];
}
}
System.out.print("第"+(i+1)+"次排序后: ");
System.out.println(Arrays.toString(arr));
}
}
}
二分查找
在一个有序序列中查找其中某个元素,我们可以采用二分查找(折半查找),它的基本思想是:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
package com.briup.chap04;
public class Test06_BinarySearch {
//二分查找:针对有序序列进行 查找
public static void main(String[] args) {
int[] arr = {1, 3, 4, 5, 7, 9, 10};
int index = binarySearch(arr, 1);
System.out.println("1: " + index);
index = binarySearch(arr, 2);
System.out.println("2: " + index);
index = binarySearch(arr, 10);
System.out.println("10: " + index);
}
//二分查找算法,如果value存在arr中,则返回元素位置,如果找不到返回-1
public static int binarySearch(int[] arr,int value) {
int start = 0;
int end = arr.length - 1;
int mid;
while(true) {
mid = (start+end) / 2;
if(value == arr[mid])
return mid;
else if(value > arr[mid]) {
start = mid + 1;
}else {
end = mid - 1;
}
//当start > end 循环结束
if(start > end)
break;
}
return -1;
}
}