在学习快速排序过程中个人认为菜鸟教程的文章挺容易理解。想学习建议去传送门,下面为个人学习代码,以及产生的问题。
- 原理:选一个基准值,一般为第一个值,再从后找第一个小于基准值的数放到前面,再从前面找第一个大于基准值的数放到后面,多次循环后,将基准值填入找到的准确位置。这时基准值前面都是比它小的数,后面都是比它大的数。递归。
代码:
public class QuickSort {
public static void main(String[] args) {
int[] arr = {50,80,20,10,60,90,30,40,70};
sort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
static void sort(int[] a,int left,int right) {
if(left<right) {
int i=left,j=right,flag=a[left];//这行原本是想放在上面if语句外面,但是会发生很多错误,已解决。看下面另一个代码块
while(i<j) {
while(i<j && a[j]>=flag) {//从后向前找比flag小的值
j--;
}
if(i<j) {//找到之后将值填入前面的坑中去,此时j位置相当于多了一个坑
a[i]=a[j];
i++;
}
while (i<j && a[i]<=flag) {//从前向后找比flag大的值
i++;
}
if(i<j) {找到后将值填入后面的坑中
a[j]=a[i];
j--;
}
}
a[j]=flag;//最后将flag值填入
sort(a,left,i-1);//递归,将i前面的排序
sort(a,i+1,right);//递归,将i后面的排序
}
}
}
解决上面小问题
static void sort(int[] a,int left,int right) {
int i=left,j=right,flag=a[left];
while(i<j) {
while(i<j && a[j]>=flag) {
j--;
}
if(i<j) {
a[i]=a[j];
i++;
}
while (i<j && a[i]<=flag) {
i++;
}
if(i<j) {
a[j]=a[i];
j--;
}
}
a[j]=flag;
if(i-1>left)//有可能数组原本就是顺序的,这时i一直为0,i-1之后小于left
sort(a,left,i-1);
if(i+1<right)
sort(a,i+1,right);
}
}