**
Java数组排序和查找
**
1)冒泡排序
相邻的两个元素进行比较,如果符合条件换位。
特点:第一圈,最值出现在最后位。
优点:稳定。
缺点:慢,效率低,每次只能移动相邻两个数据。
示例:
<pre class="java" name="code">//冒泡排序
public static void bubbleSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)//外循环控制比较次数
{
for(int y=0;y<arr.length-x-1;y++)//-x:让每一次比较的元素减少;-1:避免角标越界
{
if(arr[y]>arr[y+1])
{
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
}
//对数组的输出进行了封装
public static void printArray(int[] arr)
{
System.out.print("[");
for(int x=0;x<arr.length;x++)//遍历数组
{
if(x!=arr.length-1)//如果不是数组中最后一个值
{
System.out.print(arr[x]+",");
}else{
System.out.println(arr[x]+"]");
}
}
}
public static void main(String[] args)
{
int[] arr={2,7,9,6,5,4,55,41};
//排序前
printArray(arr);
//进行排序
bubbleSort(arr);
//排序后
printArray(arr);
}
2)选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
也就是先拿0角标位置与其他角标依次比较,最小的到0角标位置,在拿1角标位置与其他角标依次比较(0角标除外),最小的到1角标位置,以此类推比较。
特点:内循环结束一次,最值出现头角标位置上。
优点:移动数据的次数已知(n-1次);
缺点:比较次数多,不稳定。
示例:
//选择排序
public static void selectSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++)
{
if(arr[x]>arr[y])
{
//对位置进行置换
int temp=arr[x];//定义一个临时容器
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
//输出数组方法
public static void printArray(int[] arr)
{
System.out.print("[");
for(int x=0;x<arr.length;x++)
{
if(x!=arr.length-1)
{
System.out.print(arr[x]+",");
}else
{
System.out.println(arr[x]+"]");
}
}
}
public static void main(String[] args)
{
int[] arr={2,4,6,3,7,8,9};
//排序前
printArray(arr);
//进行排序
selectSort(arr);
//排序后
printArray(arr);
}
3)插入排序
插入排序:已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)
优点:稳定,快。
缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
//插入排序
public static void insertionSort(int[] arr)
{
for(int x=1;x<arr.length;x++)
{
for(int y=x;(y>0)&&(arr[y]<arr[y-1]);y--)
{
int temp=arr[y];
arr[y]=arr[y-1];
arr[y-1]=temp;
}
}
}
public static void printArray(int[] arr)
{
System.out.print("[");
for(int x=0;x<arr.length;x++)
{
if(x!=arr.length-1)
{
System.out.print(arr[x]+",");
}else{
System.out.println(arr[x]+"]");
}
}
}
public static void main(String[] args)
{
int[] arr={1, 3, 2, 5, 12, 123, 23, 2, 541, 1, 76, 76};
//排序前
printArray(arr);
//进行排序
insertionSort(arr);
//排序后
printArray(arr);
}
**
查找
**
二分查找又称折半查找
优点:比较次数少,查找速度快,平均性能好;
缺点:要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
示例:
方式1
public static int halfSearch(int[] arr,int key){
int min,max,mid;
min = 0;//小
max = arr.length-1;//大
mid = (max+min)/2;//中
while(arr[mid]!=key ){
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
if(min>max)
return -1;
mid = (max+min)/2;
}
return mid;
}
方式2
public static int halfSearch_2(int[] arr,int key){
int min = 0,max = arr.length-1,mid;
while(min<=max){
mid = (max+min)>>1;//>>1相当与/2
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}