最近在看2020年考研素材,哭
什么算法都自己动手写一遍吧
关于时间复杂度系列~
但是这种书上的实现方式,其实也蛮巧妙地,如果是面试也蛮好记住
但是,归其原理,
还是两个哨兵,high哨兵和low哨兵
high就不断地找比基准值小的,
然后low哨兵就不断找比基准值大的,
然后两者进行交换,
最终如果low == high
那么也就是这一次基准值归位了~
然后进行递归实现就好了
很酷是不是~
实现:
class QuickSort2 {
public static void quickSort(int[] arr, int low, int high) {
if (low > high) {
return;
}
int pivotpos = partition(arr, low, high);
//递归调用左半数组
quickSort(arr, low, pivotpos - 1);
//递归调用右半数组
quickSort(arr, pivotpos + 1, high);
}
private static int partition(int[] arr, int low, int high) {
/**
* 这种写法,是数据结构教材中推荐的写法
* 将之改写成java
* */
int pivot = arr[low];
while (low < high) {
while (pivot <= arr[high] && low < high) {
high--;
}
arr[low] = arr[high];
while (pivot >= arr[low] && low < high) {
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
private static String printArray(int[] arr){
StringBuffer sb = new StringBuffer();
for(int i : arr){
sb.append(i + " ");
}
return sb.toString();
}
public static void main(String[] args) {
int[] arr = {10, 7, 6, 3, 4, 2, 1, 8, 9, 5};
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
冒泡排序:
package leetcode;
/*
* 冒泡排序
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {6, 3, 8, 2, 9, 1};
System.out.println("排序前数组为:");
for (int num : arr) {
System.out.print(num + " ");
}
bubbleSort(arr);
System.out.println();
System.out.println("排序后的数组为:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void bubbleSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {//外层循环控制排序趟数
for (int j = 0; j < arr.length - 1 - i; j++) {//内层循环控制每一趟排序多少次
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
关于快速排序其实一个博主实现挺好的,原理也很明白~!
https://blog.csdn.net/qq_26122557/article/details/79458649
代码更容易懂~
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
//pivot 作为基准值比较合适
int i, j, pivot, t;
if (low > high) {
return;
}
i = low;
j = high;
//temp就是基准位
pivot = arr[low];
while (i < j) {
//先看右边,依次往左递减
while (pivot <= arr[j] && i < j) {
j--;
}
//再看左边,依次往右递增
while (pivot >= arr[i] && i < j) {
i++;
}
//如果满足条件则交换
if (i < j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = pivot;
//递归调用左半数组
quickSort(arr, low, j - 1);
//递归调用右半数组
quickSort(arr, j + 1, high);
}
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
class QuickSort2 {
public static void quickSort(int[] arr, int low, int high) {
if (low > high) {
return;
}
int pivotpos = partition(arr, low, high);
//递归调用左半数组
quickSort(arr, low, pivotpos - 1);
//递归调用右半数组
quickSort(arr, pivotpos + 1, high);
}
private static int partition(int[] arr, int low, int high) {
/**
* 这种写法,是数据结构教材中推荐的写法
* 将之改写成java
* */
int pivot = arr[low];
System.out.println("初始数组 " + printArray(arr));
while (low < high) {
while (pivot <= arr[high] && low < high) {
high--;
}
arr[low] = arr[high];
System.out.println("high -- 过程数组 " + printArray(arr));
while (pivot >= arr[low] && low < high) {
low++;
}
arr[high] = arr[low];
System.out.println("low ++ 过程数组 " + printArray(arr));
}
System.out.println("将pivot赋值之前的数组 " + printArray(arr));
arr[low] = pivot;
System.out.println("将pivot赋值之后的数组 " + printArray(arr));
return low;
}
private static String printArray(int[] arr){
StringBuffer sb = new StringBuffer();
for(int i : arr){
sb.append(i + " ");
}
return sb.toString();
}
public static void main(String[] args) {
int[] arr = {10, 7, 6, 3, 4, 2, 1, 8, 9, 5};
quickSort(arr, 0, arr.length - 1);
}
}
结果输出:
初识数组 10 7 6 3 4 2 1 8 9 5
high -- 过程数组 5 7 6 3 4 2 1 8 9 5
low ++ 过程数组 5 7 6 3 4 2 1 8 9 5
将pivot赋值之前的数组 5 7 6 3 4 2 1 8 9 5
将pivot赋值之后的数组 5 7 6 3 4 2 1 8 9 10//其实只要看第一遍代码运行过程就了解了代码的意思,之后便是递归了
初识数组 5 7 6 3 4 2 1 8 9 10
high -- 过程数组 1 7 6 3 4 2 1 8 9 10
low ++ 过程数组 1 7 6 3 4 2 7 8 9 10
high -- 过程数组 1 2 6 3 4 2 7 8 9 10
low ++ 过程数组 1 2 6 3 4 6 7 8 9 10
high -- 过程数组 1 2 4 3 4 6 7 8 9 10
low ++ 过程数组 1 2 4 3 4 6 7 8 9 10
将pivot赋值之前的数组 1 2 4 3 4 6 7 8 9 10
将pivot赋值之后的数组 1 2 4 3 5 6 7 8 9 10
初识数组 1 2 4 3 5 6 7 8 9 10
high -- 过程数组 1 2 4 3 5 6 7 8 9 10
low ++ 过程数组 1 2 4 3 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 4 3 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 4 3 5 6 7 8 9 10
初识数组 1 2 4 3 5 6 7 8 9 10
high -- 过程数组 1 2 4 3 5 6 7 8 9 10
low ++ 过程数组 1 2 4 3 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 4 3 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 4 3 5 6 7 8 9 10
初识数组 1 2 4 3 5 6 7 8 9 10
high -- 过程数组 1 2 3 3 5 6 7 8 9 10
low ++ 过程数组 1 2 3 3 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 3 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10
初识数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10
初识数组 1 2 3 4 5 6 7 8 9 10
high -- 过程数组 1 2 3 4 5 6 7 8 9 10
low ++ 过程数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10
初识数组 1 2 3 4 5 6 7 8 9 10
high -- 过程数组 1 2 3 4 5 6 7 8 9 10
low ++ 过程数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10
初识数组 1 2 3 4 5 6 7 8 9 10
high -- 过程数组 1 2 3 4 5 6 7 8 9 10
low ++ 过程数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10
初识数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之前的数组 1 2 3 4 5 6 7 8 9 10
将pivot赋值之后的数组 1 2 3 4 5 6 7 8 9 10