基础排序算法与二分查找算法Java版本(下)

来源:互联网 发布:linux登陆root用户 编辑:程序博客网 时间:2024/06/01 16:25
public class Sort {    public static void swap(int[] temp ,int a,int b){        int t = temp[a];        temp[a] = temp[b];        temp[b] = t;    }    //选择排序,从无序数组中选出一个合适的数值插入至数组中    public static void selectSort(int[] array)    {        int min;        for(int i = 0; i < array.length;i++){            //用于对比的值            min = i;            //从i+1 到 数组尾部中选出一个余下数组中最小的值放入前面的有序部分中            for(int j = i + 1; j < array.length;j++){                if(array[j] < array[min])                    min = j;            }            swap(array,i,min);        }    }    //希尔排序,也是插入排序的一种,它是将待排序列分成若干组后,    //先在小组内进行插入排序,然后逐渐减少间隔增加组数,    //最终整个数组进行一次插入排序,效率很高。    public static void shellSort(int[] array)    {        int len = array.length;        for(int gap = len; gap > 0 ; gap/=2)            for(int i = gap; i < len ; i++)                for(int j = i - gap; j >= 0;j-=gap){                    if(array[j] > array[j+gap])                        swap(array,j,j+gap);                }    }    //堆排序,是插入排序的一种,先要建立起最小堆,然后在对堆进行排序    public  static void MinHeapFix(int[] array,int i,int len){        //从i节点开始        int k,temp;        temp = array[i];    //父节点        k = i*2+1;      //i的左子节点        while(k < len){            //找出两个子节点中小的那个            if(k+1 < len && array[k]>array[k+1])                k++;                     //若最小的自节点大于根节点,那么符合最小堆规则            if(array[k] >= temp)                 break;           //若不符合最小堆规则,把较小的节点往上移动,并对余下           //的堆进行判断            array[i] = array[k];               i = k;            k=k*2+1;        }        array[i] = temp;    }    //建立最小堆    public static void MakeMinHeap(int[] array,int len){        //i节点的父节点的下标为(i-1)/2        for(int i = len/2 - 1; i>=0;i--)            MinHeapFix(array,i,len);    }    public static void HeapSort(int[] array,int len){        for(int i = len-1;i >=1;i--){            //和插入排序一样,每次将余下的树中最小数放到最后,            //余下的数建立一个最小堆            swap(array,0,i);            MinHeapFix(array,0,i);        }    }    //二分查找法    public static int binarySearch(int[] array,int target){        int start = 0;        int end = array.length;        int mid = 0;        while(end > start){            mid = start+((end-start) >> 1);            if(array[mid] > target) end = mid-1;            else if(array[mid] < target) start = mid +1;            else return mid;        }        return -1;    }}
0 0