使用冒泡排序算法实现对数据的升序排列。
原理说明:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//首先定义一个数组
int[] arr={5,2,7,6,4,9,3};
for(int i=0;i<a1.length-1;i++){
for(int j=0;j<a1.length-1-i;j++){
if(a1[j]>a1[j+1]){
int t=a1[j];
a1[j]=a1[j+1];
a1[j+1]=t;
}
for(int n:a1){
System.out.print(n+",");
}
System.out.println();
}
for(int n:a1){
System.out.print(n+"----");
}
System.out.println();
}
//打印输出排序结果
for(int i=0;i<a1.length;i++){
System.out.print(a1[i]+",");
}
每趟排序所得结果:
2,5,7,6,4,9,3,
2,5,7,6,4,9,3,
2,5,6,7,4,9,3,
2,5,6,4,7,9,3,
2,5,6,4,7,9,3,
2,5,6,4,7,3,9,
第一趟:2----5----6----4----7----3----9----
2,5,6,4,7,3,9,
2,5,6,4,7,3,9,
2,5,4,6,7,3,9,
2,5,4,6,7,3,9,
2,5,4,6,3,7,9,
第二趟:2----5----4----6----3----7----9----
2,5,4,6,3,7,9,
2,4,5,6,3,7,9,
2,4,5,6,3,7,9,
2,4,5,3,6,7,9,
第三趟:2----4----5----3----6----7----9----
2,4,5,3,6,7,9,
2,4,5,3,6,7,9,
2,4,3,5,6,7,9,
第四趟:2----4----3----5----6----7----9----
2,4,3,5,6,7,9,
2,3,4,5,6,7,9,
第五趟:2----3----4----5----6----7----9----
2,3,4,5,6,7,9,
第六趟:2----3----4----5----6----7----9----
2,3,4,5,6,7,9,
字符串反转实现:
通过二分法实现字符串的反转问题:
public static void main(String[] args) {
String s = "abcde";
int start = 0;
int end = s.length() - 1;
char[] charArray = s.toCharArray();
while (start < end) {
//交换首尾char值
char c = charArray[end];
charArray[end] = charArray[start];
charArray[start] = c;
start++;
end--;
}
System.err.println(new String(charArray));
}
二分查找(Binary Search)
算法描述:
● 二分查找也称折半查找,它是一种效率较高的查找方法,要求列表中的元素首先要进行有序排列。
● 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
● 否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
● 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
/**
* @author : atguigu.com
* @since 2019/7/22
*/
public class BinarySearch {
/**
* 二分查找 时间复杂度O(log2n);空间复杂度O(1)
*
* @param arr 被查找的数组
* @param left
* @param right
* @param findVal
* @return 返回元素的索引
*/
public static int binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) {//递归退出条件,找不到,返回-1
return -1;
}
int midIndex = (left + right) / 2;
if (findVal < arr[midIndex]) {//向左递归查找
return binarySearch(arr, left, midIndex, findVal);
} else if (findVal > arr[midIndex]) {//向右递归查找
return binarySearch(arr, midIndex, right, findVal);
} else {
return midIndex;
}
}
public static void main(String[] args) {
//注意:需要对已排序的数组进行二分查找
int[] data = {- 49, -30, -16, 9, 21, 21, 23, 30, 30
};
int i = binarySearch(data, 0, data.length, 21);
System.out.println(i);
}
}