快速排序算法有点像冒泡排序但是比冒泡排序要高效,时间复杂度是nlogn
好了,废话不多说直接开始快速排序的原理。
4, 3, 6, 7, 2, 9,-4,-90,67,88,4 这是一个无序的数组,快速排序的第一步就是找到一个数当作一个中间数,然后把小于这个数的放在它的左边,大于它的数的放在右边(降序反之)。例如:我选择第一个数字4当作中间数,然后开始找3比4要小放到左边3,4 , 6, 7, 2, 9,-4,-90,67,88,4,6比4要大放到右边3,4 , 6, 7, 2, 9,-4,-90,67,88,4,剩下就是一样的,然后就完成了第一次的排序-90, 3, 2, -4, 4, 9, 7, 6, 67, 88, 4,再一次就是把4左边的选择第一个(看你自己)重复上面的操作,把4右边的重复上面的操作,这里就是一个递归的过程。因为没有图片可能大家理解起来还是不太好,我就直接来代码吧。
public class Test13 {
public static void main(String[] args) {
int arr[] ={ 4, 3, 6, 7, 2, 9,-4,-90,67,88,4 };
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int left,int right) {//快排函数
if (left<right) {//这里是递归的条件,我们不可以让递归一直进行,
//要防止栈溢出,当左边大于右边的时候这就说明只有一个数进行排序我
//们也就没有必要比较,然后排序了说明就已经排好了
int s=result(arr, left, right);//这里是获得每一次递归后的你选取的第一个数字当作中间数后现在在数组的第几个,s就是第几个的下标
quickSort(arr, left, s-1);//这里是左递归,s-1就是中间数前一个
quickSort(arr, s+1, right);//这里是右递归
}
}
public static void swap(int i,int j,int arr[]) {//这是是一个交换的函数
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static int result(int[] arr,int p,int q) {//这个比较的重要,就是返回排序的那个s的
int x=arr[p];//获得中间数,x就是中间数p的选择一般是选择数组的第一个
int i=p,j;//i就是从p开始
for (j=p+1;j<arr.length;j++) {
if (x>arr[j]) {//当中间数大于数组中的一个数的时候
i++;//i加一就是往后移一位,再交换,这里有些人理解起来有点问题
//比如4 6 3 8这个数组,4是x,x是小于6的所以不用管,x大于3
//i前面是等于p=0的所以i++,i就是1了,i=1和j=2进行交换就是4 3 6 8
swap(i, j, arr);
}
}
swap(p, i, arr);//这一步也是关键,因为我们前面都没有对中间数进行交换
//所以这里要做一个交换
return i;//返回的就是中间数的下标
}
}
好了,我觉得我的代码解释的已经很明白了,我把我当时遇到的不理解的地方,都重点给大家讲了一下,希望对大家有帮助