二分查和快速排序
2019-11-18 本文已影响0人
一直想上树的猪
一、二分查
package com.tinner.algorithm;
import sun.util.resources.cldr.eu.LocaleNames_eu;
import javax.swing.tree.FixedHeightLayoutCache;
/**
* @author Tinner
* @date 2019-11-17
* @Description 二分查找
*/
public class BinarySearch {
/**
* 使用递归完成二分查找
*
* @param arr 有序数组
* @param key 待查找关键字
* @param low
* @param hight
* @return 找到的位置
*/
public static int recursionBinarySearch(int[] arr, int key, int low, int hight) {
if (key < arr[low] || key > arr[hight] || low > hight) {
return -1;
}
int middle = (low + hight) / 2;
if (arr[middle] > key) {
return recursionBinarySearch(arr, key, low, middle - 1);
} else if (arr[middle] < key) {
return recursionBinarySearch(arr, key, middle + 1, hight);
} else {
return middle;
}
}
/**
* 不使用递归完成二分查找
*
* @param arr 有序数组
* @param key 待查找关键字
* @return 找到的位置
*/
public static int commonBinarySearch(int[] arr, int key) {
int low = 0;
int hight = arr.length - 1;
int middle = 0;
if (key < arr[low] || key > arr[hight] ||low > hight ) {
return -1;
}
while (low <= hight) {
middle = (low + hight) / 2;
if (arr[middle] > key) {
hight = middle - 1;
} else if (arr[middle] < key) {
low = middle + 1;
} else {
return middle;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11};
int key = 9;
int position = recursionBinarySearch(arr,key,0,arr.length - 1);
// int position = recursionBinarySearch(arr, key);
if (position == -1) {
System.out.println("查找的是" + key + ",序列中没有该数!");
} else {
System.out.println("查找的是" + key + ",找到位置为:" + position);
}
}
}
二、快速排序
package com.tinner.algorithm;
import java.util.Arrays;
/**
* @author Tinner
* @date 2019-11-17
* @Description 快速排序
*/
public class QuickSort {
//记录循环个数
private static int count;
public static void main(String[] args) {
int[] nums = new int[]{
7, 1, 3, 5, 13, 9, 3, 6, 11
// 7,1,5,3,13,9,6
};
System.out.println("数组初始化为:" + Arrays.toString(nums));
sort(nums, 0, nums.length - 1);
System.out.println("经过快排之后:" + Arrays.toString(nums));
System.out.println("循环的次数为:" + count);
}
public static void sort(int[] array, int left, int right) {
if(left > right) {
return;
}
// base中存放基准数
int base = array[left];
int i = left, j = right;
while(i != j) {
// 顺序很重要,先从右边开始往左找,直到找到比base值小的数
while(array[j] >= base && i < j) {
j--;
}
// 再从左往右边找,直到找到比base值大的数
while(array[i] <= base && i < j) {
i++;
}
// 上面的循环结束表示找到了位置或者(i>=j)了,交换两个数在数组中的位置
if(i < j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
// 将基准数放到中间的位置(基准数归位)
array[left] = array[i];
array[i] = base;
count++;
// 递归,继续向基准的左右两边执行和上面同样的操作
// i的索引处为上面已确定好的基准值的位置,无需再处理
sort(array, left, i - 1);
sort(array, i + 1, right);
}
}