基本排序方法

来源:互联网 发布:农村淘宝怎么下载 编辑:程序博客网 时间:2024/06/16 06:44
public class SimpleSort {    /*        二分查找:在有序的数组中查找元素。如 1 2 3 4 5 7 8 9 查找 5        将数组的中间元素与5比较,然后分成两半,可以得到5在 5 7 8 9中,在循环上面的操作。        T(n) = T(n/2) + θ(1),时间复杂度为O(logn)     */    public int binarySearch(int[] a, int key) {        int lower = 0;        int upper = a.length - 1;        while (true) {            int mid = (lower + upper) / 2;            if (lower > upper)  //该条件必须在前面                return -1;            else if (a[mid] == key)                return mid;            else if (a[mid] > key)                upper = mid - 1;            else if (a[mid] < key)                lower = mid + 1;        }    }    public int binaryFind(int[] a, int lower, int upper, int key) {        int mid = (lower + upper)/2;        if (lower > upper)            return -1;        else if (a[mid] == key)            return mid;        else if(a[mid] > key)            return binaryFind(a, lower, mid-1, key);        else            return binaryFind(a, mid+1, upper, key);    }    /*        选择排序:有一组数5 1 9 22 20 74 8 19,分别固定前面的位置,并将该位置的        数与后面的数比较,交换位置把最小或者最大的数放在该索引位上。     */    public void selectSort(int[] a) {        for (int i = 0; i < a.length - 1; i++) { //0到n-2的位置固定            for (int j = i+1; j < a.length ; j++) {                if (a[i] > a[j])                    swap(a,i,j);            }        }    }    /*        冒泡排序:和选择排序不同的地方在于,冒泡排序是相邻元素比较,一轮比较确定一个位置        如 25 15 2 15 68 35 99 8,一轮比较后25 15 2 15 68 35  8 99,二轮25 15 2 15 35 8 68 99     */    public void bubbleSort(int[] a) {        for (int i = a.length - 1; i >= 1; i--) { //把i当成固定的位置            for (int j = 0; j < i; j++) {         //比较的元素范围为0到i,j+1=i                if (a[j] > a[j+1])                    swap(a,j,j+1);            }        }    }    /*        插入排序:5 58插入38,变成5 38 58,插入8,变成5 8 38 58,插入28,变成5 8 28 38 58        插入排序假设已有的数有序,插入的元素分别与已有的数比较,如5 8 38 58中插入28,        28插入到8和38之间,这时将比28大的数的索引右移一位,插入的位置赋值28.     */    public void insertSort(int[] a) {        for (int i = 1; i < a.length; i++) { //初始a[0]有序,插入a[i]//            int tmp = a[i];//            int j = i;//            while (j > 0 && tmp < a[j-1]) {//                a[j] = a[j-1];//                j--;//            }//            a[j] = tmp;            int tmp = a[i];            int index = -1;            for (int j = i-1; j >= 0 ; j--) {                if (tmp < a[j]) {           //与a[j]比较的tmp保持不变                    a[j+1] = a[j];                    index = j;              //记录插入位置的索引                }            }            if (index != -1)                a[index] = tmp;        }    }    public void swap(int[] a, int i, int j) {        int tmp = a[i];        a[i] = a[j];        a[j] = tmp;    }    public void display(int[] a) {        for (int i = 0; i < a.length; i++) {            System.out.print(a[i] + "\t");        }        System.out.println();    }    public static void main(String[] args) {        int[] a = {1, 2, 3, 4, 5, 7, 8, 9};        SimpleSort sort = new SimpleSort();        int i = sort.binarySearch(a, 5);        System.out.println(i);          //i=4        int j = sort.binaryFind(a,0,a.length-1,20);        System.out.println(j);          //-1        int[] b = {5, 1, 9, 22, 20, 74, 8, 19};        System.out.print("选择排序前:");        sort.display(b);                //选择排序前:519222074819        sort.selectSort(b);        System.out.print("选择排序后:");        sort.display(b);                //选择排序后:158919202274        int[] c = {25, 15, 2, 15, 68, 35, 99, 8};        System.out.print("冒泡排序前:");        sort.display(c);                //冒泡排序前:25152156835998        sort.bubbleSort(c);        System.out.print("冒泡排序后:");        sort.display(c);                //冒泡排序后:28151525356899        int[] d = {18, 115, 12, 27, 8, 35, 99, 16};        System.out.print("插入排序前:");        sort.display(d);                //插入排序前:1811512278359916        sort.insertSort(d);        System.out.print("插入排序后:");        sort.display(d);                //插入排序后:8121618273599115    }} 


原创粉丝点击