排序算法之快速排序

mac2026-09-24  14

看到这个名字是不是第一感觉就是这个排序算法好,可以快速排序。到底是不是这样呢?我们先来看一下原理吧! 可以证明,快速排序的平均时间复杂度也是O(nlog2n)。因此,该排序方法被认为是目前最好的一种内部排序方法。


图片来源于百度百科; 快速排序是利用递归实现的分段排序。当数据序列长度为1时结束这一段的排序。如上图所示。 代码来源于百度

public static int[] qsort(int arr[],int start,int end) { //获取第一个数据 int pivot = arr[start]; //i指向数组开始 int i = start; //j指向数组末尾 int j = end; //当i<j时,也就是说当i==j时不会执行下面的排序,最短的情况就是i==j while (i<j) { //当i<j并且arr[j]大于pivot时,j--,因为要把大数放在右边,把小数放在左边,所以只需要j-- while ((i<j)&&(arr[j]>pivot)) { j--; } //同样,这里只需要i++ while ((i<j)&&(arr[i]<pivot)) { i++; } //当然也有一种情况就是i<j,但是arr[i]==arr[j],这个时候就不需要再交换arr[i]和arr[j],当然,你可以令i++,也可以令j--; if ((arr[i]==arr[j])&&(i<j)) { i++; } else { //排除上面所有情况,下面就是开始排序了,此时在i的位置的数等着和在j的位置的数交换。 所以,交换一下这两个位置的数就好了 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } //比如i=2,i-1=1,1>0,也就是说,至少两个数要排一下序。递归排序。递归对一个数组的一部分进行排序 if (i-1>start) arr=qsort(arr,start,i-1); //同样,这个和上面思路一样 if (j+1<end) arr=qsort(arr,j+1,end); return (arr); } public static void main(String[] args) { int arr[] = new int[]{3,3,3,7,9,122344,4656,34,34,4656,5,6,7,8,9,343,57765,23,12321}; int len = arr.length-1; arr=qsort(arr,0,len); for (int i:arr) { System.out.print(i+"\t"); }
最新回复(0)