您的位置:首页 > 其它

排序和查找算法(冒泡、快速、二分法)

2017-02-23 16:16 148 查看

冒泡排序

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束


public void exeBubbleSort(int[] arr){
//循环躺数
for(int i=0;i<arr.length;i++){
//从左往右循环比较相邻元素大小,大的换到右边
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}


快速排序

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public void exeQuickSort(int arr[],int low,int high){
//左侧起始下标
int l=low;
//右侧起始下标
int h=high;
//中间值
int povit=arr[low];
//一趟循环,指导左右侧下标相等
while(l<h)
{
//从右向左,当前值不小于中间值时,h递减,直到当前值小于中间值或l==h
while(l<h&&arr[h]>=povit)
h--;
//如果当前值小于中间值,交换左右侧数据
if(l<h){
int temp=arr[h];
arr[h]=arr[l];
arr[l]=temp;
l++;
}
//从左向右,当前值不大于中间值时,l递增,直到当前值大于中间值或l==h
while(l<h&&arr[l]<=povit)
l++;
//如果当前值大于中间值,交换左右侧数据
if(l<h){
int temp
4000
=arr[h];
arr[h]=arr[l];
arr[l]=temp;
h--;
}
}
for(int a:arr){
System.out.print(a);
}
System.out.println();
System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");
//如果此次循环左侧有交换(即此次中间值不是最小值),将中间值以左作为新的排序区间
if(l>low)exeQuickSort(arr,low,l-1);
//如果此次循环右侧有交换(即此次中间值不是最大值),将中间值以右作为新的排序区间
if(h<high)exeQuickSort(arr,l+1,high);
}


二分法查找

//递归实现二分法查找
int BinarySearch(int[] a,int key,int low,int high)
{
if(low>high||key<a[low]||key>a[high])        //越界处理
{
return -1;
}
int middle=(low+high)/2;
if(key==a[middle])
{
return middle;
}
if(middle==low||middle==high)
{
if(key==a[low])
{
return low;
}
if(key==a[high])
{
return high;
}
else
{
return -1;
}
}
if(key<a[middle])
{
return BinarySearch(a,key,low,middle);
}
if(key>a[middle])
{
return BinarySearch(a,key,middle,high);
}
return -1;
}

//循环实现二分法查找
int BinarySearchByCircle(int * a,int key,int high)
{
int low=0;
int middle;
while(high>=low)
{
middle=(high+low)/2;
if(key==a[middle])
{
return middle;
}
if(key<a[middle])
{
high=middle-1;
}
if(key>a[middle])
{
low=middle+1;
}
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: