<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">JAVA实现的冒泡排序和选择排序</span>
- 冒泡排序-----思想:从头开始,两两比较。将较大的数字逐渐后移到最后面。共进行arr.length-1轮。复杂度为O(n的二次方)---(n-1)+(n-2)+(n-3)+...+2+1
- 选择排序-----思想:每轮循环都假设arr[i]为最小值。然后进行比较,如果还有比arr[i]更小的数字,则将minIndex设置为当前,最后,如果minIndex不是i,则交换arr[i]和arr[minIndex],共进行arr.length-1轮。复杂度为O(n的二次方)----(n-1)+(n-2)+(n-3)+...+2+1
- 二分查找的思想是不断缩小问题规模,根据查找的元素不断更新upperIndex和lowerIndex。注意这里的arr参数是经过排序的数组。
- 冒泡,选择排序,二分查找的一般实现和递归实现 的 java程序源代码和测试程序如下:
package com.marthevin.hhu.demo1226;
public class Demo1226 {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Demo1226 demo = new Demo1226();
int[] arr = {2,54,23,22,65,3,64,22,89,235,53232,432,4533};
//demo.bubbleSort(arr);
demo.selectSort(arr);
//System.out.println(demo.searchIndex(arr, 22, 0, arr.length-1));
System.out.println(demo.halfSearch(arr, 34343));
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
public int getMax(int[] arr)
{
int max = arr[0];;
for(int i=1;i<arr.length;i++)
{
if(max<=arr[i])
{
max = arr[i];
}
}
return max;
}
public void bubbleSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>=arr[j+1])
{
arr[j] = arr[j]^arr[j+1];
arr[j+1]=arr[j]^arr[j+1];
arr[j]= arr[j+1]^arr[j];
}
}
}
}
public void selectSort(int[] arr )
{
for(int i=0;i<arr.length-1;i++)
{
int minIndex = i;
for(int j=i+1;j<arr.length;j++)
{
if(arr[j]<arr[minIndex])
{
minIndex = j;
}
}
if(minIndex!=i)
{
//如果minIndex不等于i,交换arr[minIndex]和arr[i]即最终将最小值放在第一个位置
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
}
}
}
public int searchIndex(int[] arr,int item, int lowerIndex,int upperIndex)
{
int midIndex = (upperIndex+lowerIndex)/2;
if(item==arr[midIndex])
{
return midIndex+1;
}else if(item>arr[midIndex]){
return searchIndex(arr, item, midIndex,upperIndex);
}else{
return searchIndex(arr, item, lowerIndex,midIndex);
}
}
public int halfSearch(int[] arr,int item)
{
int upperIndex = arr.length-1;
int lowerIndex = 0;
int midIndex = (upperIndex+lowerIndex)/2;
while(true)
{
if(item>arr[midIndex])
{
lowerIndex = midIndex+1;
}else if(item<arr[midIndex]){
upperIndex = midIndex-1;
}else{
return midIndex+1;
}
if(upperIndex<lowerIndex){
return -1;
}
midIndex = (upperIndex+lowerIndex)/2;
}
}
}