-
Notifications
You must be signed in to change notification settings - Fork 23
常用算法
wswenyue edited this page Oct 18, 2015
·
3 revisions
##常用算法 ###排序
冒泡排序
冒泡:比较两个相邻的数:左边小,右边大
- 算法实现
冒泡排序:比较相邻的两个数,小的在左边,大的在右边
public static void bubbleSort(int[] a){
for(int i = 0;i<a.length-1;i++){ //比较的趟数
for(int j = 0 ; j <a.length-1-i;j++){ //每一趟比较的次数
if(a[j]>a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1]= t;
}
}
}
}
选择排序
选择:每趟基准值,用于存储最小
- 算法实现
public static void selectSort1(int[] a){
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
选择排序---增强版 效率高(建议使用)
public static void selectSort(int[] a){
for(int i=0;i<a.length-1;i++){
int minIndex = i ; //最小值的下标
for(int j = i+1 ;j<a.length;j++){
if(a[minIndex]>a[j]){
minIndex = j;
}
}
//循环结束
if(minIndex!=i){
int t = a[i];
a[i] = a[minIndex];
a[minIndex] = t;
}
}
}
插入排序
插入:从第二个数值开始,向前边的数列插入保持原有的顺序
- 算法实现
//插入排序:默认左边的数是有序的
public static void insertSort(int[] a){
for(int i = 1 ; i<a.length ; i++){
for(int j=i;j>0;j--){
if(a[j]<a[j-1]){//保证左边的为最小的数
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}else{
break;//如果当前值比左边的值大,则不需要比较
}
}
}
}
###查找
顺序查找
顺序:挨个比较
- 算法实现
顺序查找:如果找到了,返回对应的下标,如果没有找到返回-1
/*
顺序查找:如果出现了数组中元素重复的情况,不保证找到的是哪一个
*/
static int find(int[] a,int key){
for(int i=0;i<a.length;i++){
if(a[i]==key){ //找到了,返回下标
return i;
}
}
return -1;
}
二分法查找
二分:前提:有序 折半查找
- 算法实现
/*
二分法查找:前提:必须数组有序
确定中间位置:
*/
static int binaryFind(int[] a,int key){
int low = 0 ;
int high = a.length - 1;
int mid = 0;
while(low<=high){
mid = (low+high)/2;//也可以这样写:mid = (low+high)>>1;
if(a[mid]>key){ //左边区域查找
high = mid - 1;
}
else if(a[mid]<key){ //右边区域查找
low = mid + 1;
}
else{
return mid; //找到了
}
}
return -1; //没有找到
}