一、冒泡排序
冒泡排序是一种比较简单的排序算法
- 排序原理:
这种算法的原理是重复访问要排序的数组,对相邻的两个元素进行比较,如果顺序错误就将两个元素的内容交换,一直到没有两个相邻元素需要交换,排序完成。
这个算法名称的由来是由于在不断的元素比较交换过程中,较小的元素会慢慢的浮到数组的顶端,就像水中的气泡往上浮一样,故名"冒泡排序"; - java代码示例:
public static void main(String args[]){
// 冒泡排序
// 定义一个数组
int[] array = {32,21,66,10,29,60};
System.out.println("排序前------------------------");
printArray(array);
// 外层循环是数组长度减1
for(int x = 0; x < array.length - 1; x++){
// 内层循环是数组长度-1-外层角标,减少循环次数
for(int y = 0; y < array.length - 1 - x; y++){
// 比较相邻两个数,将大的往后放
if(array[y] > array[y + 1]){
int temp = array[y + 1];
array[y + 1] = array[y];
array[y] = temp;
}
}
}
System.out.println("排序后------------------------");
printArray(array);
}
// 打印
private static void printArray(int[] array) {
StringBuffer str = new StringBuffer();
for(int i = 0; i < array.length; i++){
str.append(array[i]).append(",");
}
System.out.println(str.toString());
}
二、选择排序
- 原理:
从角标为0的位置开始,每一个数依次和后面的数比较,大的往后放,小的往前,直到所有元素排列完成。 - java代码示例:
public static void main(String args[]){
// 选择排序
// 定义一个数组
int[] array = {32,21,66,10,29,60};
System.out.println("排序前------------------------");
printArray(array);
// 外层循环是数组长度减1
for(int x = 0; x < array.length - 1; x++){
// 内层循环从x+1开始
for(int y = x + 1; y < array.length; y++){
// 第一个数和后面每一个数比较,如果比后面的数大,则往后放
if(array[x] > array[y]){
int temp = array[y];
array[y] = array[x];
array[x] = temp;
}
}
}
System.out.println("排序后------------------------");
printArray(array);
}
// 打印
private static void printArray(int[] array) {
StringBuffer str = new StringBuffer();
for(int i = 0; i < array.length; i++){
str.append(array[i]).append(",");
}
System.out.println(str.toString());
}
三、二分查找
二分查出适合数据比较大的情况,但是前提是有序的。
原理:
在一个有序排列的数组中,将数组从中间分成2个区间A、B,判断目标值在哪一个区间里面,如在A里面则将A继续分成两份查找,直到找到目标值。
取数组的最小角标min,最大角标max,中间角标mid =(min+max)/2
先找数组的中间角标的值和目标值比较,
- 如果比目标值小,说明目标值在数组右边,min = mid+1,在继续查直到找到目标值;
- 如果比目标值大,说明在数组的左边,min = mid-1,在继续查直到找到目标值;
- 如果相等则结束;
public static void main(String args[]){
// 二分查找
// 定义一个数组(必须是有序的)
int[] array = {10,20,30,40,50,60,70,80};
System.out.println("查找60在数组中的位置:");
printArray(array);
int index = getIndex(array, 60);
System.out.println("60在数组中的位置是:"+ index);
}
private static int getIndex(int[] array, int val) {
int min = 0;// 最小角标
int max = array.length - 1;// 最大角标
int mid = (min + max) / 2;// 中间角标
while (array[mid] != val){
// 如果中间角标的值大于目标值,则最小角标为中间角标-1
if(array[mid] > val){
min = mid - 1;
} else if(array[mid] < val) {
// 如果中间角标的值小于目标值,则最小角标为中间角标+1
min = mid + 1;
}
if(min > max){
return -1;
}
// 重新计算中间角标
mid = (min + max) / 2;
}
return mid;
}
// 打印
private static void printArray(int[] array) {
StringBuffer str = new StringBuffer();
for(int i = 0; i < array.length; i++){
str.append(array[i]).append(",");
}
System.out.println(str.toString());
}