你最需要的–快速排序的详解
·废话少说,呈上快排的代码
package ajie.java.sort;
import java.util.Scanner;
public class QuikSort {
public static void quickSort(int[] arrars,int left,int right){
int i,j,temp,t;
if(left>right){
return;
}
i=left;
j=right;
//temp就是基准位
temp = arrars[left];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arrars[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arrars[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arrars[j];
arrars[j] = arrars[i];
arrars[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arrars[left] = arrars[i];
arrars[i] = temp;
//递归调用左半数组
quickSort(arrars, left, j-1);
//递归调用右半数组
quickSort(arrars, j+1, right);
}
public static void main(String[] args){
//创建一个简单的数组
int[] arrays = {9,5,2,3,7,72,3,4,34,1,2,34,29};
/*
*也可以换成下面的代码自己输入数字
*/
// Scanner scanner = new Scanner(System.in);
// System.out.println("请输入数据的个数:");
// int sum = scanner.nextInt();
// int arrays[] = new int [sum];
// System.out.println("请输入"+sum+"个0——100的整数:");
// for (int i = 0; i < arrays.length; i++) {
// arrays[i] = scanner.nextInt();
// }
quickSort(arrays, 0, arrays.length-1);
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
}
}
·说一下快排的原理(要是知道可以跳过,很多博主都有写过)
快速排序的基本原理就是“二分法”,尽量减少计算步骤,提高效率–将序列切分,一次比较。
1.将初始序列从两端开始比较,比较的基准数为每次截取数列的最左边的数。左边取i记录比较进度,右边取j记录。从j(右端)开始找到一个小数(比基准数小的)就停止,换成i(左端)比较,知道i找到一个大数(比基准数大的)也同样停止。
2.交换j发现的小数和j发现的大数,后依然用刚才的基准数。继续向中间前进!!
(嘿嘿,每次都是j先出发哦)
3.重复步骤2,直到–j==i,就是j和i指向一个数字,停止第一轮比较,并把最左边的基准数拿到这个位置。现在这个点就是中位数点,点的左边是小数(小于或等于基准数),点的右边是大数(大于或等于基准数)。
4.重复截取数列,直到全部数列比较完成。就欧克了。
&操作的过程如下图:
!!!!该原理和截图参考 啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。
·写代码过程中遇到的难点
~return
if(left>right){
return;
}
快排的核心就是,return结合递归一边一边的调用二分法,达到排序的目的.
~运算的实际过程
//递归调用左半数组
quickSort(arrars, left, j-1);
//递归调用右半数组
quickSort(arrars, j+1, right);
一开始对过程并不了解,出了不少岔子
~基准数的选择
自我感觉快排的选取基准数是相当巧妙的
!!!!声明:该原理和截图参考 啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。
递归调用右半数组
quickSort(arrars, j+1, right);
一开始对过程并不了解,出了不少岔子
~基准数的选择
自我感觉快排的选取基准数是相当巧妙的
**!!!!声明:该原理和截图参考 啊哈磊 著《啊哈!算法》,强烈推荐这本算法书入门,简单易懂。**