数据结构->排序->交换排序
排序->内部排序->交换排序
所谓交换,是指根据序列中两个关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多,但书中主要介绍的只有两种:冒泡排序、快速排序。
1.冒泡排序
算法思想
从前往后(或从后往前)比较两两相邻元素的值,若为逆序,则交换他们,否则进行下次比较,直到序列有序。
实现代码
/**
* 冒泡排序
* 依次比较相邻两个位置的元素大小,如果逆序,则交换,直到排序成功。
* @param arr
*/
public static void BubblingSort(int[] arr){
boolean flag;
for(int i = 0; i < arr.length; i++){
flag = false;
for(int j = i+1; j < arr.length; j++){
if(arr[i] > arr[j]){
Util.swap(arr, i, j);
flag = true;
}
}
if(!flag){
return ;
}
}
}
2.快速排序
算法思想
基于分治法。
每次取一个基准,根据基址将待排序表分为左右两个待排序子表,使得左边的子表中的值都小于等于基准的值,右边子表的值都大于等于基准的值。然后对两个待排序子表分别取基址,重复上述步骤,直到每个子表中只含有一个元素,则此时所有元素全部有序。
实现思路
- 取基准,无论是主表还是子表,都以当前表/子表中的第一个元素为基准,小于等于该基准的放在左边,大于等于该基准的放在右边,当依次排序之后,基准的位置也确定了,将它返回,供递归使用。
- 取到基准后,左侧递归解决左子序列,右侧递归解决右子序列。
实现代码
/**
* 冒泡排序
* 依次比较相邻两个位置的元素大小,如果逆序,则交换,直到排序成功。
* @param arr
*/
public static void BubblingSort(int[] arr){
boolean flag;
for(int i = 0; i < arr.length; i++){
flag = false;
for(int j = i+1; j < arr.length; j++){
if(arr[i] > arr[j]){
Util.swap(arr, i, j);
flag = true;
}
}
if(!flag){
return ;
}
}
}
/**
*
*/
public static void QuickSort(int[] arr){
qSort(arr, 0, arr.length-1);
}
private static void qSort(int[] arr, int start, int end){
if(start < end){
int i = getPartition(arr, start, end);
qSort(arr, start, i-1); // 递归解决左侧
qSort(arr, i+1, end); // 递归解决右侧
}
}
private static int getPartition(int[] arr, int start, int end){
int value = arr[start]; // value暂存元素
while (start < end){
while(start < end && arr[end] >= value){ // 在右边找到一个值小于等于value的元素
end--;
}
arr[start] = arr[end]; // 元素找到,放在左边
while(start < end && arr[start] <= value){ // 在左边找一个值大于等于value的元素
start++;
}
arr[end] = arr[start]; // 元素找到,放在右边
}
arr[start] = value; // 基准的位置确定,为start
return start;
}