注意:以下算法都是升序排序
1. 选择排序
如对arr = [4,3,2,1]进行排序,
4 | 3 | 2 | 1 |
(1). 先将arr[0] 与arr[1]进行比较,若arr[0] > arr[1],则互换位置。如下所示:
3 | 4 | 2 | 1 |
(2). 先将arr[0] 与arr[2]进行比较,若arr[0] > arr[2],则互换位置。如下所示:
2 | 4 | 3 | 1 |
(3). 先将arr[0] 与arr[3]进行比较,若arr[0] > arr[3],则互换位置。如下所示:
1 | 4 | 3 | 2 |
arr[0]已经排好且为最小值
(1). 先将arr[1] 与arr[2]进行比较,若arr[1] > arr[2],则互换位置。如下所示:
1 | 3 | 4 | 2 |
(2). 先将arr[1] 与arr[3]进行比较,若arr[1] > arr[3],则互换位置。如下所示:
1 | 2 | 4 | 3 |
arr[1]已经排好且为最小值
(1). 先将arr[2] 与arr[3]进行比较,若arr[2] > arr[3],则互换位置。如下所示:
1 | 2 | 3 | 4 |
arr[2]已经排好且为最小值
程序:
// 实现数组的选择排序
public static void selectSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
// arr[i]与arr[j]进行元素互换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//for(int k=0;k<arr.length;k++){
//System.out.print(arr[k]);
//}
}
2. 冒泡排序
如对arr = [4,3,2,1]进行排序,
4 | 3 | 2 | 1 |
(1) 比较
arr[0] 与arr[1]
arr[1] 与arr[2]
arr[2] 与arr[3]
(2) 再比较
arr[0] 与arr[1]
arr[1] 与arr[2]
(3) 再比较
arr[0] 与arr[1]
程序:
// 实现数组的冒泡排序
public static void bubbleSort(int[] arr){
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 = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//for(int k=0;k<arr.length;k++){
//System.out.print(arr[k]);
//}
}
3. 插入排序
如对arr = [4,3,2,1]进行排序,
4 | 3 | 2 | 1 |
排序过程简图:
public static void insertSort(int[] arr){
for(int i=1;i<arr.length;i++){
// 从arr[i]开始,移动arr[1]以前的元素(arr[i]假设以前元素已经排好),将arr[i]插入到合适的位置(i=1,2,3...arr.length-1)
int a0 = arr[i];
int j=i;
while((j>0)&& arr[j-1]>a0){
arr[j] = arr[j-1];
j--;
}
arr[j] = a0;
}
//for(int k=0;k<arr.length;k++){
//System.out.print(arr[k]);
//System.out.print(" ");
//}
}
4. 二分查找
// 二分查找 a需要是升序数组
public static int binarySearch(int key, int [] a){
int min = 0;
int max = a.length - 1;
while(min <= max){
int mid = (min + max)/2;
if(key < a[mid]){
max = mid - 1;
}else if(key > a[mid]){
min = mid + 1;
}else{
return mid;
}
}
return -1;
}