冒泡,选择,快速排序
2016-07-04 本文已影响118人
兴厚
马上要面试了,温习一下基础算法,本文快速排序参考博文.
算法最重要的是理解,最好自己写一遍,so...
冒泡:
思路:两个for循环,外层控制循环次数,为数组长度减一,里层控制比较次数,是逐级递减的,所以需要减去i的值.代码实现:
//冒泡排序(升序)
public void bubbleSort(int[] a){
int temp;
//控制循环的次数,数组长度-1
for(int i=1;i<a.length;i++){
//控制每次循环的比较次数
for(int j=0;j<a.length-i;j++){
//开始比较并交换(降序换个符号即可)
if(a[j] > a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
选择:
思路:两个for循环,每次循环都将找到一个最小(大)值放在外层循环次数 i 的位置,里层循环进行比较,然后交换最小值的位置,最后再进行交换.代码实现:
//选择排序(升序)
public void selectSort(int[] a){
int temp;
//循环开始,次数为数组长度-1
for(int i=0;i<a.length-1;i++){
//定义最小值的位置为每次循环的首位
int min = i;
//这个循环作用是找到最小值的位置
for(int j=i+1;j<a.length;j++){
if(a[j] < a[min]){
min=j;
}
}
//判断是否进行了交换,是则将最小值放到每次循环开始的首位
if(min != i){
temp = a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
快速排序
思路:个人理解,这种方法类似二分法,也是找寻"中间位置",不过这种方式是先定义一个基数,比这个小的放左边,比这个大的放右边,返回这个"中间"位置,再细分,每次细分都要进行判断是否"最左边"是否小于"最右边".当"最左边"等于"最右边"的时候,将基数放入那个位置,代码实现:
//快速排序
public void quickSort(int a[],int left,int right){
if(left < right){
int i=left,j=right;
int x= a[left];
while(i<j){
//先找到比基准数小的数放入首位置
while(i<j && a[j]>=x){
j--;
}
//找到就交换值,然后i+1
if(i<j)
a[i++]=a[j];
//找比基准数大的数,放入a[right]的位置
while(i<j && a[i] < x){
i++;
}
//交换值,并j-1
if(i<j)
a[j--]=a[i];
}
//退出时i==j
a[i]=x;
//left~(i-1)区间排序
quickSort(a,left,i-1);
//(i+1)~right区间排序
quickSort(a,i+1,right);
}
}
注意:前面for循环的时候尽量将a.length赋值给一个确切变量,这对提升速率可是很有帮助的.