java四大常用排序算法
package www.suanfa.sort;
/**
- 方法描述:
- 冒泡排序
- 快速排序
- 插入排序
- 选择排序
- 折半查找
- @author PC
*/
public class Sort {
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
int[] arr={0,3,5,2,7,1,8,3,11};
// int[] bubblearr=bubbleSort(arr);
// int[] bubblearr=quickSearch(arr, 0, arr.length-1);
// int[] bubblearr=insertSort(arr);
int[] bubblearr=selectSort(arr);
for (int i : bubblearr) {
System.out.println(i);
}
int a=binarySearch(bubblearr, 1);
System.out.println("________________");
System.out.println(a);
}
/**
* 冒泡排序——循环遍历数组,依次把大的数排到后面
* @param arr
* @return int[]
*/
public static int[] bubbleSort(int[] arr) {
int i,j;
//for(i=arr.length;i>0;i--) {
//排序次数
for(i=0;i<arr.length-1;i++) {
//每次排序前后两个数对比
for(j=1;j<arr.length-i;j++) {
//当前面的数大于后面时交换
if(arr[j-1]>arr[j]) {
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
return arr;
}
/**
* 快速排序——取出一个基准,分别从后往前找小于基准胡数(不换位置)再从前往后找大于基准的数
* 再把他们交换,也就相当于一个交换同时完成了划分大于基准的肯小于基准的!
* @param arr
* @param low
* @param hight
* @return
*/
public static int[] quickSearch(int[] arr,int low,int hight) {
//取出基准
int key=arr[low];
int begin=low;
int end=hight;
if(low>hight) return null;
while(begin<end ) {
//从后往前对比,知道遇到后面小于基准的停下来
while(arr[end]>=key&&begin<end) {
end--;
}
//从前往后对比,知道遇到前面大于基准的停下来
while(arr[begin]<=key&&begin<end)
begin++;
//交换
if(begin<end) {
int temp=arr[begin];
arr[begin]=arr[end];
arr[end]=temp;
}
}
//把基准放到中间位置,即把数组分成大于基准和小于基准的两部分
arr[low]=arr[begin];
arr[begin]=key;
//递归
if(low<begin) quickSearch(arr, low, begin-1);
if(hight>end) quickSearch(arr, end+1, hight);
return arr;
}
/**
* 插入排序——默认插入数的左边已经排好序了!
* @param arr
* @return
*/
public static int[] insertSort(int[] arr) {
int i,j;
for(i=1;i<arr.length;i++) {
//取出待插入的数
int insertVal=arr[i];
int index=i-1;
//循环遍历插入左边的数且要求比它大就-1否则退出
while(insertVal<arr[index]&&index>0) {
//记得往后移动
arr[index+1]=arr[index];
//当退出循环时index-1了,所以在插入有时候index要加1;
index--;
}
//将数插入到index+1的位置
//当退出循环时index-1了,所以在插入有时候index要加1;
arr[index+1]=insertVal;
}
return arr;
}
/**
* 选择排序——循环选择最小的数值放到前面来
* @param arr
* @return
*/
public static int[] selectSort(int[] arr) {
int i,j,temp;
for(i=0;i<arr.length-1;i++) {
//记录最小的下标
int min=i;
//循环对比,但赋值的是下标
for(j=i+1;j<arr.length;j++) {
if(arr[min]>arr[j])
min=j;
}
//判断最小值的下标是不是原来的,否则将他们交换。
if(min!=i) {
temp=arr[min];
arr[min]=arr[i];
arr[i]=temp;
}
}
return arr;
}
/**
* 折半查找
* @param arr
* @param num
* @return
*/
public static int binarySearch(int[] arr,int num) {
int low=0;
int high=arr.length-1;
int mid;
while(low<high) {
mid=(low+high)/2;
if(arr[mid]==num)
return mid;
if(num<arr[mid])
high=mid;
if(num>arr[mid])
low=mid;
}
return -1;
}
}
个人博客:java1024家园