一、冒泡排序
//冒泡排序
public static void bubbleSort(int[] array) {
//bound作为划分界限
for(int bound = 0;bound<array.length;bound++) {
for(int cur = array.length-1; cur > bound; cur--) {
if(array[cur-1]>array[cur]) {
swap(array,cur-1,cur);
}
}
}
}
private static void swap(int[] array,int x,int y) {
int tmp = array[x];
array[x] = array[y];
array[y] = tmp;
}
二、快速排序(递归版本)
//递归版本:快速排序
public static void quickSort(int[] array) {
//[0,array.length-1]表示对数组的该区间进行排序
quickSortHelper(array,0,array.length-1);
}
private static void quickSortHelper(int[] array,int left,int right) {
if(left >= right) {
//只有一个元素或者没有元素则不需要排序
return;
}
//选取基准值,小于它的放左边,大于它的放右边
//[left,right]整理完后,返回基准值的下标
int index = partition(array,left,right);
quickSortHelper(array,left,index - 1);
quickSortHelper(array,index + 1,right);
}
private static int partition(int[] array,int left,int right) {
int baseIndex = left;
int baseValue = array[baseIndex];
//循环结束后,right指向位置为从右往左第一个比基准值小的元素
while(left<right) {
while(left<right && array[right] >= baseValue) {
right--;
}
//循环结束后,left指向位置为从左往右第一个比基准值大的元素
while(left<right && array[left] <= baseValue) {
left++;
}
//交换left和right位置的元素
swap(array,left,right);
}
/*
把left和right重合位置的元素,与基准值进行交换。
交换前提是left和right重合位置对应元素,必须大于基准值
循环结束两种情况:
1.left++导致结束:swap之后right指向大于基准值的元素,
如果left和right重合,则一定指向大于基准值的元素。
2.right--导致结束:此时left刚找到大于基准值的元素,且
left与right重合,则对应元素一定大于基准值。
*/
swap(array,left,baseIndex);
return left;
}
private static void swap(int[] array,int x,int y) {
int tmp = array[x];
array[x] = array[y];
array[y] = tmp;
}
三、快速排序(非递归版本)
//非递归版本:快速排序
public static void quickSortByLoop(int[] array) {
//创建一个栈,存放待处理区间的下标
Stack<Integer>stack = new Stack<>();
//初始情况下,待处理区间为整个数组
stack.push(array.length - 1);
stack.push(0);
while(!stack.isEmpty()) {
//取栈顶元素,即为要处理的区间
int left = stack.pop();
int right = stack.pop();
if(left >= right) {
continue;
}
//对当前待处理区间进行调整
int index = partition(array,left,right);
//对待处理区间进行入栈
//[left,index -1]
//[index + 1,right]
stack.push(index - 1);
stack.push(left);
stack.push(right);
stack.push(index + 1);
}
}