快速排序
一、快速排序的基本思想
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二、代码
1.核心代码
quickSort(int left,int right){
int i = left;
int j = right;
int temp=a[left];
int t;
while(i!=j){ //①当i与j没有相遇的时候,执行移动查找
while(j>i && a[j]>=temp){
j--; //②略过大于等于基准值的下标
} //③当找到小于基准值,j下标停止移动
while(i<j && a[i]<=temp){
i++; //②略过小于等于基准值的下标
} //③当找到大于基准值,i下标停止移动
if(i<j){ //④交换下标i和j的元素值
t = a[i];
a[i]=a[j];
a[j]=t;
}
} //⑤当i与j相遇的时候,停止移动查找
//⑥交换基准值和当前相遇下标的元素值
a[left]=a[i];
a[i]=temp;
//⑦完成一轮分区,已经将区域划分去左右两个分区,执行递归,对分区继续操作
quickSort(left,i-1);
quickSort(j+1,right);
}
2.快速排序源码实现
package sort;
public class QuickSort {
private static int[] a = {6,1,2,7,9,3,4,5,10,8};
public static void main(String[] args){
System.out.println("原数组值:");
for (int i : a) {
System.out.print(i+" ");
}
System.out.println();
quickSort(0, a.length-1);
}
public static void quickSort(int left,int right){
int i,j,temp;
if(left>right){
return;
}
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j){
//顺序很重要,要先从右边开始找 ,直到找到一个小于基准的值
while(a[j]>=temp && i<j){
j--;
}
//再找右边的 ,直到找到一个大于基准的值
while(a[i]<=temp && i<j){
i++;
}
//交换两个数在数组中的位置
if(i<j) {
int t=a[i];
a[i]=a[j];
a[j]=t;
System.out.println("交换值后:");
for (int k : a) {
System.out.print(k+" ");
}
System.out.println();
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
System.out.println("基准值归位后:");
for (int k : a) {
System.out.print(k+" ");
}
System.out.println();
if(left<i-1){
quickSort(left,i-1);//继续处理左边的,这里是一个递归的过程
}
if(right>j+1){
quickSort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
}
}