快排写法
写法一:
package quickSort;
public class QuickSort {
private static int count;
/**
* 测试
* @param args
*/
public static void main(String[] args) {
int[] num = {3,45,78,64,52,11,64,55,99,11,18};
System.out.println(arrayToString(num,"未排序"));
QuickSort(num,0,num.length-1);
System.out.println(arrayToString(num,"排序"));
System.out.println("数组个数:"+num.length);
System.out.println("循环次数:"+count);
}
/**
* 快速排序
* @param num 排序的数组
* @param left 数组的前针
* @param right 数组后针
*/
private static void QuickSort(int[] num, int left, int right) {
//如果left等于right,即数组只有一个元素,直接返回
if(left>=right) {
return;
}
//设置最左边的元素为基准值
int key=num[left];
//数组中比key小的放在左边,比key大的放在右边,key值下标为i
int i=left;
int j=right;
while(i<j){
//j向左移,直到遇到比key小的值
while(num[j]>=key && i<j){
j--;
}
//i向右移,直到遇到比key大的值
while(num[i]<=key && i<j){
i++;
}
//i和j指向的元素交换
if(i<j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
num[left]=num[i];
num[i]=key;
count++;
QuickSort(num,left,i-1);
QuickSort(num,i+1,right);
}
/**
* 将一个int类型数组转化为字符串
* @param arr
* @param flag
* @return
*/
private static String arrayToString(int[] arr,String flag) {
String str = "数组为("+flag+"):";
for(int a : arr) {
str += a + "\t";
}
return str;
}
}
写法二:
/*******************************************************
*快速排序 (比较排序类)
*每次排序将待排记录分割两部分,一部分都比关键字小,一部分都比关键字大
********/
public void quickSort(int[] L) {
Qsort(L,1,L.length-1);
}
public void Qsort(int[] L,int low,int high) {
int pivot;
if(low<high) {
//将L[low,high]一分为二,算出枢轴值pivot,该值得位置固定,不用再变化
pivot=partition0(L,low,high);
//对两边的数组分别排序
Qsort(L,low,pivot-1);
Qsort(L,pivot+1,high);
}
}
// 选择一个枢轴值(关键字) 把它放到某个位置 使其左边的值都比它小 右边的值都比它大
public int partition0(int[] L,int low,int high) {
int pivotkey;
pivotkey=L[low];
//顺序很重要,要先从右边找
while(low<high) {
while(low<high && L[high]>=pivotkey) { //从后往前找到比key小的放到前面去
high--;
}
swap(L,low,high);
while(low<high && L[low]<=pivotkey) { //从前往后找到比key大的 放到后面去
low++;
}
swap(L,low,high);
} //遍历所有记录 low的位置即为 key所在位置, 且固定,不用再改变
return low;
}
//交换数组的两个位置
public void swap(int[] L,int i,int j) {
int temp=L[i];
L[i]=L[j];
L[j]=temp;
}
代码来源,节选自:
https://blog.csdn.net/qq_36186690/article/details/82470451
https://blog.csdn.net/weixin_30363263/article/details/82462088