public static void main(String[] args) {
int[] arr = { 5,2,4,9,7 }; //创建要排序的数组
sort(arr, 0, arr.length - 1);//数组的两端下标,和数组,调用排序逻辑方法
}
public static void sort(int arr[], int low, int high) {//静态方法,main方法中可以直接调用
int l = low;//接收入参的最小下标
int h = high;//接收入参数组的最大下标
int k = arr[low];//入参最小下标的值
while (l < h) {//如果最小下标的数字小于最大下标,执行while循环:从最大下标的数字一个一个和为0下标的比较
// 从后往前比较
//循环前:l==0 h==4(arr.length - 1) arr[h]从大到小的数字 K 下标0的数字
while (l < h && k<=arr[h] ) { // 如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
//如果下标0的数字大于从大到小排序的,记录查询的h的下标,h值等于下标值
h--;// h=6
}
System.out.println(h);
if (l < h) {//while循环得到要替换的h值,这边做个替换,其实这个if里的判断没什么卵用,为了防止多执行,用for也可以改一下格式
int temp = arr[h];//比第一个值小的值赋值给temp
arr[h] = arr[l];//把下标l 位置的值放在下标h的位置上
arr[l] = temp;//下标h位置的值放在l下标上
//进行过一次替换后,没必要将替换后的两值再次比较,所以i++直接下一位与k对比
l++;//l让后移动一个位置
}
// 从前往后比较,保留最大的
while (l < h && k>=arr[l] ) { // 如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
l++;
}
if (l < h) {
int temp = arr[h];//最右边数字保存到变量中
arr[h] = arr[l];//从左比较比h下标大的数,放在h下标上
arr[l] = temp;//l下标的数与最右边的互换
h--;//最大下标-1
}
// 此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
}
// 递归
if (l > low)//先判断l>low再次经行左边排序
sort(arr, low, l - 1);// 左边序列。第一个索引位置到关键值索引-1
if (h < high)//左边依次排序执行完递归后,弹栈进行右边排序
sort(arr, l + 1, high);// 右边序列。从关键值索引+1到最后一个
}
java算法_快速排序
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 基本思想 通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小...