查找算法和排序算法综合实现
/**
* 查找算法:顺序查找()和折半查找()(二分查找)
* 排序算法:
* 交换排序:冒泡排序(),快速排序()
* 插入排序:直接插入排序(*),希尔排序
* 选择排序:简单选择排序(),堆排序()
* 归并排序:归并排序(*)
* 分配排序:箱排序,基数排序
*/
示例代码:
代码综合实现了两种基本查找算法:顺序查找和折半查找;
六种基本排序算法:冒泡排序、直接插入排序、简单选择排序、快速排序、归并排序以及堆排序。
import java.util.Arrays;
import java.util.Scanner;
/**
* 查找算法和排序算法综合实现
* 查找算法:顺序查找(*)和折半查找(*)(二分查找)
* 排序算法:
* 交换排序:冒泡排序(*),快速排序(*)
* 插入排序:直接插入排序(*),希尔排序
* 选择排序:简单选择排序(*),堆排序(*)
* 归并排序:归并排序(*)
* 分配排序:箱排序,基数排序
*/
public class SearchAndSort {
public static void main(String[] args) {
int[] arr = {9,7,5,3,1,2,4,6,8};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+" ");
}
System.out.println("\n请输入一个数字:");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
//顺序查找
System.out.println("顺序查找:");
int sequenSearch = sequenSearch(arr,num);
if(sequenSearch != -1){
System.out.println("查找成功,数字位于数组第"+(sequenSearch+1)+"位!");
}else{
System.out.println("查找失败!");
}
//排序
Arrays.sort(arr);
//bubbleSort(arr);
//insertSort(arr);
//selectSort(arr);
int lower = 0;
int upper = arr.length-1;
//quickSort(arr,lower,upper);
//megeSort(arr,lower,upper);
//heapSort(arr);
System.out.println("数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
//折半查找
System.out.println("\n折半查找:");
int binarySearch = binarySearch(arr,num);
if(binarySearch != -1){
System.out.println("查找成功,数字位于数组排序后第"+(binarySearch+1)+"位!");
}else{
System.out.println("查找失败!");
}
}
//顺序查找
private static int sequenSearch(int[] arr, int num) {
for(int i=0;i<arr.length;i++){
if(num == arr[i]){
return i;
}
}
return -1;
}
//折半查找
private static int binarySearch(int[] arr, int num) {
int lower = 0;
int upper = arr.length-1;
while (lower <= upper) {
int middle = (lower+upper)/2;
if(arr[middle] < num){
lower = middle+1;
}else if(arr[middle] > num){
upper = middle-1;
}else{
return middle;
}
}
return -1;
}
//冒泡排序
private static void bubbleSort(int[] arr) {
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//直接插入排序
private static void insertSort(int[] arr) {
for(int i=1;i<arr.length;i++){
int temp = arr[i];
int j = i-1;
for(;j>=0 && arr[j]>temp;j--){
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
//简单选择排序
private static void selectSort(int[] arr) {
int position = 0;
for(int i=0;i<arr.length;i++){
position = i;
int temp = arr[i];
for(int j=i+1;j<arr.length;j++){
if(arr[j] < temp){
position = j;
temp = arr[j];
}
}
arr[position] = arr[i];
arr[i] = temp;
}
}
//快速排序
private static void quickSort(int[] arr, int lower, int upper) {
if(lower < upper){
int middle = getMiddle(arr, lower, upper);
quickSort(arr, lower, middle);
quickSort(arr, middle+1, upper);
}
}
private static int getMiddle(int[] arr, int lower, int upper) {
while (lower < upper) {
while (lower < upper && arr[lower] <= arr[upper]) {
upper--;
}
if(lower < upper){
int temp = arr[lower];
arr[lower] = arr[upper];
arr[upper] = temp;
}
while (lower < upper && arr[lower] <= arr[upper]) {
lower++;
}
if(lower < upper){
int temp = arr[lower];
arr[lower] = arr[upper];
arr[upper] = temp;
}
}
return lower;
}
//归并排序
private static void megeSort(int[] arr, int lower, int upper) {
if(lower < upper){
int middle = (lower+upper)/2;
megeSort(arr, lower, middle);
megeSort(arr, middle+1, upper);
mege(arr, lower, middle, upper);
}
}
//归并
private static void mege(int[] arr, int lower, int middle, int upper) {
int[] tempArr = new int[arr.length];
int third = lower;
int mid = middle+1;
int temp = lower;
while (lower <= middle && mid <= upper) {
if(arr[lower] <= arr[mid]){
tempArr[third++] = arr[lower++];
}else{
tempArr[third++] = arr[mid++];
}
}
while (lower <= middle) {
tempArr[third++] = arr[lower++];
}
while (mid <= upper) {
tempArr[third++] = arr[mid++];
}
while (temp <= upper) {
arr[temp] = tempArr[temp++];
}
}
//堆排序
private static void heapSort(int[] arr) {
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr, i, arr.length);
}
for(int j=arr.length-1;j>0;j--){
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
adjustHeap(arr, 0, j);
}
}
//调整堆
private static void adjustHeap(int[] arr, int i, int n) {
int temp = arr[i];
for(int k=i*2+1;k<n;k=k*2+1){
if(k+1<n && arr[k] < arr[k+1]){
k++;
}
if(arr[k] > temp){
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;
}
}