您的位置:首页 > 编程语言 > Java开发

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

2015-11-15 00:57 459 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息