基本思想:
- 基于"二分"思想
- 找一个数作为基准数,然后左右俩个探针开始找茬,
- 先从右边开始找,找到比它小的数的位置a
- 接着从左边开始找,找到比它大的数,换位置b
- 如果他们的探针位置没有相遇,就交换a,b
- 如果探针他们遇到了,归位基准数
- 递归调用,左边与右边
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
* @author NIWA
*
*
* 依次输入5个数字
*/
public class Main {
int[] a = new int[100];
int temp;//基准数
static int n;//排序个数
int i;
int j;
public static void main(String[] args) {
Main mMain = new Main();
mMain.scanf();
mMain.sort(1, n);
mMain.print();
}
private void print() {
for (int i = 1; i <= n; i++) {
System.out.println(a[i]);
}
}
/**
* 输入数据
* */
private void scanf() {
Scanner sc1 =new Scanner(System.in);
n = sc1.nextInt();
for (int i = 1; i <= n; i++) {
Scanner sc2 = new Scanner(System.in);
a[i] = sc2.nextInt();
}
}
/**
* 快速排序
*/
private void sort(int left, int right) {
if(left > right){
return;
}
temp = a[left];
i = left;
j = right;
while(i != j){
//顺序很重要,要从右边开始向左找,找比基准数小的
while(a[j] >= temp && i < j){
j--;//如果大于temp,那就接着找
}
//从左边向右找比基准数大的
while(a[i] <= temp && i < j){
i++;
}
//如果还没相遇,那就交换两个数在数组中的位置
if(i < j){
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//基准数归位,放到该放的位置
a[left] = a[i];
a[i] = temp;
sort(left, i-1);//继续处理左边的,这里是一个递归的过程
sort(i+1, right);//右边的
}
}
测试
6
8 7 5 3 9 4
输出
3 4 5 7 8 9
时间复杂度
- 最坏情况,可以是=相邻的俩个数进行了交换,最差时间复杂度和冒泡排序一样是O(N^2)
- 平均时间复杂度为O(NlogN)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。