Java排序[理解]+优化冒泡+二分查找

来源:互联网 发布:白鹿原小说败笔 知乎 编辑:程序博客网 时间:2024/06/04 18:27
/** * 这个优化版冒泡版:当数组已经为有序数组时,会跳出循环。 * 即类似[1,2,3,9,4,5]的数组时,会减少复杂度 * @author yangm * */// 冒泡排序:class BubbleSort {    public static void sort(int arr[]) {        System.out.println("优化冒泡排序:");        int len = arr.length - 1, count = 0;        for (int i = 0; i < len; i++) { // 由数组长度控制总次数            // 假设数组已经是有序数组了。如果发生交换表示假设为false,否则为true            boolean sorted = true;             for (int j = 0; j < len -i; j++) {                 count++;                if (arr[j] > arr[j + 1]) { // 不能用j++,会改变J的值。                    int temp = arr[j];                    arr[j] = arr[j + 1];                    arr[j + 1] = temp;                    sorted = false;                }            }            if (sorted) {                break;            } // 表示已经为有序数组!        } // end out-for        System.out.println("count:" + count);        ClassicSortDriver.showArr(arr);    }// end method}// end class
/** * 选择排序自己理解: * -从乱序数组里面选择一个数与未排序数组里面每个元素比较大小,记住最小元素的下标 * 内层循环结束,交换未排序数组第一个元素与最小元素。 * 外层循环从第二个元素继续,得到第二个最小元素放在排序数组的后面,即与未排序数组第一个元素交换 * @author yangm * */class SelectSort{    public static void sort(int arr[]) {        System.out.println("选择排序:");        int len = arr.length-1, count = 0;        for(int i = 0; i<len; i++) {            int min_index = i;            for(int j = len; j>i; j--) {                count ++;                if(arr[j]<arr[min_index]) {                    min_index = j;                }             }            int temp = arr[i];            arr[i] = arr[min_index];            arr[min_index] = temp;        }        System.out.println("count:" + count);    }//end method}//end class

个人感觉以上者两个排序方法是逻辑上最容易的理解的两个排序了。没毛病~
【后面理解逻辑了再写。这个东西和钱一样应该是多多益善!吧!】

/** * 插入排序: 第一个与第二相比,小的放前面。 *  第二个与第三相比,小的放前面。新的第二个与第一个相比,小的放前面。 * 第三个与第四个相比,小的放前面。新的第三个与第二个相比,小的放前面。如果位置正确。后面不用执行。否则同上 。。。。。 */class insertSort {    public static void sort(int arr[]) {        System.out.println("插入排序:");        int count = 0;        for(int i = 1; i < arr.length; i++) {//由数组长度控制外循环次数            for(int j = i; j > 0;j--) {                count++;                if(arr[j]<arr[j-1]) {                    int temp = arr[j];                    arr[j] = arr[j-1];                    arr[j-1] = temp;                }else break;            }//end inner for        }        System.out.println("count:" + count);        ClassicSortDriver.showArr(arr);    }//end method}

排序结果比较


二分查找。

/** * 二分法查找,理解了还是很好写的。 * @author yangm * */public static int binarySearch(int arr[], int key){    int top = 0, bottom = arr.length - 1;    while (top<=bottom){        int mid = (top + bottom) / 2; //折半        if(arr[mid] < key) {            top = mid + 1;        }else if(arr[mid] > key){            bottom = mid - 1;        }else return mid;     }    return -1;//不存在返回-1}

递归方法:

/** * 二分法查找,递归方法: * @author yangm */public static int binarySearch(int arr[], int top, int bottom, int key){    while (top<=bottom){        int mid = (top + bottom) / 2; //折半        if(arr[mid] < key) {            return binarySeach(arr,mid+1,bottom,key);        }else if(arr[mid] > key){            return binarySeach(arr,top,mid-1,key);        }else return mid;     }    return -1;//不存在返回-1}
原创粉丝点击