数据结构 第二节 查找与排序算法 

 

import java.util.Arrays;

public class SearchAndSort {
    public static void main(String[] args) {
        System.out.println("****** 无序序列查找 ******");
        int[] arr1 = {2,7,49,9,27,12,23,4,45,67};
        System.out.println("arr1原始数组:" + Arrays.toString(arr1));
        System.out.println("目标:23,下标:" + unseqSearch(arr1, 23));

        System.out.println("****** 有序序列查找 ******");
        int[] arr2 = {2,4,7,9,12,23,27,45,67};
        System.out.println("arr2原始数组:" + Arrays.toString(arr2));
        System.out.println("目标:12,下标:" + unseqSearch(arr2, 12));

        System.out.println("****** 二分查找 ******");
        System.out.println("arr2原始数组:" + Arrays.toString(arr2));
        System.out.println("目标:27,下标:" + unseqSearch(arr2, 27));

        System.out.println("****** 插入排序——直接插入排序 ******");
        int[] arr3 = {35,40,5,8,16,90,20,78,5,2};
        System.out.println("arr3原始数组:" + Arrays.toString(arr3));
        insertSort(arr3);
        System.out.println("arr3排序后数组:" + Arrays.toString(arr3));

        System.out.println("****** 插入排序——希尔排序 ******");
        int[] arr4 = {35,40,5,8,16,90,20,78,5,2};
        System.out.println("arr4原始数组:" + Arrays.toString(arr4));
        int[] group = {6,3,1};
        shellSort(arr4, group, 3);
        System.out.println("arr4排序后数组:" + Arrays.toString(arr4));

        System.out.println("****** 选择排序——直接排序 ******");
        int[] arr5 = {35,40,5,8,16,90,20,78,5,2};
        System.out.println("arr5原始数组:" + Arrays.toString(arr5));
        selectSort(arr5);
        System.out.println("arr5排序后数组:" + Arrays.toString(arr5));

        System.out.println("****** 交换排序——冒泡排序 ******");
        int[] arr6 = {35,40,5,8,16,90,20,78,5,2};
        System.out.println("arr6原始数组:" + Arrays.toString(arr6));
        bubbleSort(arr6);
        System.out.println("arr6排序后数组:" + Arrays.toString(arr6));

        System.out.println("****** 交换排序——快速排序 ******");
        int[] arr7 = {35,40,5,8,16,90,20,78,5,2};
        System.out.println("arr7原始数组:" + Arrays.toString(arr7));
        quickSort(arr7);
        System.out.println("arr7排序后数组:" + Arrays.toString(arr7));
    }

    // 无序序列查找
    public static int unseqSearch(int[] arr, int elem){
        int i = 0;
        while(i < arr.length && elem != arr[i]){
            i++;
        }
        return elem == arr[i] ? i : -1;
    }

    // 有序序列查找
    public static int orderSeqSearch(int[] arr, int elem){
        int i = 0;
        while(i < arr.length && elem > arr[i]){
            i++;
        }
        return elem == arr[i] ? i : -1;
    }

    // 二分查找
    public static int binarySearch(int[] arr, int elem){
        int begin = 0;
        int end = arr.length - 1;
        while (begin <= end) {
            int mid = (begin + end)/2;
            if(elem == arr[mid]){
                return mid;
            }else if(elem > arr[mid]){
                begin = mid + 1;
            }else if(elem < arr[mid]){
                end = mid - 1;
            }
        }
        return -1;
    }

    // 直接插入排序
    public static void insertSort(int[] arr){
        int j;
        int temp;
        for (int i = 0; i < arr.length - 1; i++) {
            temp = arr[i + 1];
            j = i;
            while(j > -1 && arr[j] > temp){
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = temp;
        }
    }

    // 希尔排序
    public static void shellSort(int[] arr, int[] group, int loopCount){
        int j;
        int temp;
        int span;
        int n = arr.length;
        for (int m = 0; m < loopCount; m++) {
            span = group[m];
            for (int k = 0; k < span; k++) {
                for (int i = k; i < n - span; i = i + span) {
                    temp = arr[i + span];
                    j = i;
                    while(j > -1 && arr[j] > temp){
                        arr[j + span] = arr[j];
                        j = j - span;
                    }
                    arr[j + span] = temp;
                }
            }
        }
    }

    // 选择排序
    public static void selectSort(int[] arr){
        int j;
        int temp;
        int small;
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            small = i;
            for (j = i + 1; j < n; j++) {
                if(arr[j] < arr[small]){
                    small = j;
                }
            }
            if(small != i){
                temp = arr[small];
                for (j = small; j > i; j--) {
                    arr[j] = arr[j - 1];
                }
                arr[i] = temp;
            }
        }
    }

    // 冒泡排序
    public static void bubbleSort(int[] arr){
        int temp;
        int flag = 1;
        int n = arr.length;
        for (int i = 0; i < n && flag == 1; i++) {
            flag = 0;
            for (int j = 0; j < n - i -1; j++) {
                if(arr[j] > arr[j + 1]){
                    flag = 1;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    // 快速排序
    public static void quickSort(int[] arr){
        int low = 0;
        int high = arr.length -1;
        quickSort(arr, low, high);
    }

    private static void quickSort(int[] arr, int low, int high) {
        int index = partition(arr, low, high);
        if(low < index){
            quickSort(arr, low, index -1);
        }
        if(index < high){
            quickSort(arr, index + 1, high);
        }
    }

    private static int partition(int[] arr, int low, int high) {
        int i = low;
        int j = high;
        int temp = arr[low];
        while(i < j){
            while(i < j && temp <= arr[j]){
                j--;
            }
            if(i < j){
                arr[i] = arr[j];
                i++;
            }
            while(i < j && temp > arr[i]){
                i++;
            }
            if(i < j){
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = temp;
        return i;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值