冒泡排序
冒泡排序的核心思想:相邻元素两两交换,将数值大的放在右边,小的放在左边,直至排序完成。总共进行n-1趟排序,每次排序进行n-i次。时间复杂度为O(n2)
public static void bubbleSort(int[] arr){
int i,j,temp;
for(i = 0;i < arr.length-1;i++){//进行n-1趟排序
for(j = 0;j < arr.length-i-1;j++){//每趟进行n-i次
if(arr[j] > arr[j+1]){//升序排列
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
快速排序
基本思想:选定一个准基数,设置两个哨兵,一个在最左端(寻找大于准基数的数),一个在最右端(先行,寻找小于准基数的数)两者进行交换,直至两者碰面,第一次将准基数放在小于与大于的它数中间。在对其小于准基数的数组,大于准基数的数组进行类似排序(递归调用)。时间复杂度为O(nlogn)
public static void quickSort(int[] arr,int low,int height){//之所以设置low,height参数视为了递归调用
int i,j,temp,t;
if(low > height) return ;
i = low;
j = height;
temp = arr[low];//一般设置第一个数为准基数
while (i<j){
while(i<j&& temp<=arr[j]) j--;//最右端先行(否则达不到排序效果),向左依次递减
while(i<j&&temp>=arr[i]) i++;//向右依次递增
if(i<j){//右端存在小于准基数的数,左端存在大于准基数的数,则交换
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//i>=j时,准基数与中间的数字交换,完成准基数左边均小于它,右边均大于它
arr[low] = arr[i];
arr[i] = temp;
//左端数组递归调用
quickSort(arr,low,j-1);
//右端数组递归调用
quickSort(arr,j+1,height);
}