注意:以下算法都是升序排序
1. 选择排序
原理:先从0角标位置元素与其他位置元素(自己除外)依次进行比较,每次比较完后最小值在最左边,并将起始位置后移一个角标,直至次尾角标位。
如对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]);
//}
}
// 改进
public static void fun1(int[] a){
// 引入布尔变量,来标识该轮有没有进行数据的交换
// 若在某一趟排序中未发现数据位置的交换,则说明所有项满足排序
boolean flag ;
for(int i = a.length-1;i > 0;i--){
flag = false;
for(int j = 0;j < i;j++){
if(a[j] > a[j+1]){
int num = a[j];
a[j] = a[j+1];
a[j+1] = num;
flag = true;
}
}
System.out.println(i);
if(!flag) return ;
}
}
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. 二分查找
无序查找:
public static int getIndex(int[] arr, int i) {
int mark=-1;//标记避免break和return语句在一起
for(int x=0;x<arr.length;x++){
if(arr[x]==i){
mark=x;
break;
}
}
return mark;
}
有序查找:
// 二分查找 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;
}