一、冒泡排序
冒泡排序算法的运作如下:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的基础算法
public static void main(String[] args) {
int[] s={3,1,6,2,9,0,7,4,8,5};
for (int i = 0; i <s.length; i++) {
boolean flag=true;
for(int j=0;j<s.length-1-i;j++) {
int temp;
if (s[j] > s[j + 1]) {
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
flag = false;
}
System.out.println(Arrays.toString(s));
}
System.out.println("################");
}
}
运行结果
冒泡排序的优化算法
1.整个数列分成两部分:前面是无序数列,后面是有序数列。
2.初始状态下,整个数列都是无序的,有序数列是空。
3.每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。
4.每一趟循环都从数列的第一个元素开始进行比较,依次比较相邻的两个元素,比较到无序数列的末尾即可(而不是数列的末尾);如果前一个大于后一个,交换。
5.判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较。
public static void main(String[] args) {
int[] s={3,1,6,2,9,0,7,4,8,5};
for (int i = 0; i <s.length; i++) {
boolean flag=true;
for(int j=0;j<s.length-1-i;j++) {
int temp;
if (s[j] > s[j + 1]) {
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
flag = false;
}
System.out.println(Arrays.toString(s));
}
if(flag){
System.out.println("结束了");
break;
}
System.out.println("################");
}
}
运行结果
二、二分法查找
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,若key小,则在数组前半部分中继续进行二分法检索;
若key大,则在数组后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
比如,我们要在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到10元素,过程如下:
public class TestBinarySearch {
public static int myBinareSearch(int[] s ,int temp){
int low=0;
int high=s.length-1;
int mid=0;
while(low<=high){
mid=(low+high)/2;
if(s[mid]==temp) {
return mid;
}
else if(s[mid]<temp){
low=mid+1;
}
else {
high=mid-1;
}
}
return -1;
}
public static void main(String[] args) {
int[] i ={1,3,7,9,5,6,2,4,8};
Arrays.sort(i);
System.out.println(Arrays.toString(i));
System.out.println(myBinareSearch(i,5));
}
}
运行结果