桶排序时间复杂度低,但是会造成资源浪费;而冒泡排序会降低资源的浪费,但是它的时间复杂度为O(n^2);这里我们介绍一种可以降低时间复杂度的排序方法---快速排序,听名字就感觉很快,是吧?废话不多说,先上代码:
package 排序;
import java.util.Scanner;
public class 快速排序 {
//设置基准数,两个哨兵,一个从左往右找大于基准数,一个从右往左找小于基准数,每次交换这两个数,直到两个哨兵碰面,将这个数和基准数交换
public static void main(String[] args) {
// TODO 自动生成的方法存根
a=new int[3];//确定数组长度
Scanner sc = new Scanner(System.in);
for(int i=0;i<a.length;i++) {
a[i]=sc.nextInt();
}
quicksort(0,a.length-1);
for(int i=0;i<a.length;i++) {
System.out.println(a[i]);
}
}
static int a[],n;
public static void quicksort(int left,int right) {//传入两个参数,为两个哨兵
//寻找结束条件
int i,j,t,temp;
if(left>right) {//当左边的哨兵在右边哨兵的右边则结束
return;
}
temp=a[left];//基准数
i=left;
j=right;
while(i!=j) {
while(a[j]>=temp&&i<j) {
j--;
}
while(a[i]<=temp&&i<j) {
i++;
}
if(i<j) {
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
a[left]=a[i];
a[i]=temp;//基准数与现在的i,j相遇的数进行互换
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
}
具体的思路步骤:
思路:它是设置一个基准数,每次会将所有数分为大于基准数或者小于基准数,然后对于大于(小于)基准数的这两堆数再进行此操作.........
具体的实现会涉及到递归,递归我理解的就是自己调用自己,相当于无限套娃。
步骤:
1.找到终止条件,即当右边的节点跑到了左边节点的左边,则表示已经将数分成了两堆,一堆是大于所选的基准数,一堆是小于所选的基准数。
2.当左右两个节点没有碰面时,则一直交换右边节点找到的小于基准数的数字,左边节点找到的大于基准数的数字。
3.当两个节点碰面时,基准数与碰面的那个数字交换。