之前已经谢过了插入排序,选择排序,希尔排序以及堆排序;
今天来写一下冒泡排序和快速排序。
5.冒泡排序
先展示一下代码,之后我来说明一下原理是什么:
public static void bubbleSort(int[] array){
for (int i = 0; i < array.length-1; i++) {
boolean flg=false;
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
swap(array,j,j+1);
flg=true;
}
}
if (flg==false){
break;
}
}
}
这个就是把最大的数字放到最后面去,之后下次遍历得时候就可以少遍历一个最后得数字,因为最后得哪个数字已经是最大的了,为了借阅时间,我们就用了array.length-1-i;i就是用来控制遍历数字的。为什么会有fag呢?如果遍历一遍都没有改变,就代表数字已经有序了,就可以直接结束。
性能分析
6.快速排序
老规矩,先展示一下代码:
public static int partition(int[] array,int start,int end){
int tmp=array[start];
while(start<end){
while(start<end&&array[end]>=tmp){
end--;
}
//end下标就遇到了<tmp的值
array[start]=array[end];
while(start<end&&array[start]<=tmp){
start++;
}
//start下标遇到了>tmp的值
array[end]=array[start];
}
array[start]=tmp;
return start;
}
public static void quick(int[] array,int left,int right){
if(left >=right) return;
int pivot=partition(array,left,right);
quick(array,left,pivot-1);
quick(array,pivot+1,right);
}
public static void quickSort(int[] array){
quick(array,0,array.length-1);
}
这里面用到了迭代的思想:
首先找到这个数组的最左边和最右边,先把第一个数字放起来,之后后面开始往前走,有比放起来的数字小的就放到前面的位置,之后前面开始往后走,有比放起来的数字大的就放到后面的位置,之后后面的继续王前面走,直到两个相遇。在相遇的位置上放上存放的数字。这样就找到了中间值,并且中间值左边都是比她小的数,右边都是比他打的数字,之后进行迭代的思想,在左边和右边继续遍历。最后就可以排序完成。
下面用图来展示一下过程:
性能分析: