【常用排序算法】快速排序(Java实现)

来源:互联网 发布:编程电脑配置 编辑:程序博客网 时间:2024/05/29 09:33

分区函数:

public static int Partition(int A[], int left, int right){     int pivot =A[right];     int index=left;     for(int i=left;i<right;i++){          if(A[i]<pivot){              int temp=A[i];              A[i]=A[index];              A[index++]=temp;          }     }     A[right]=A[index];     A[index]=pivot;     return index;}

快速排序:

public static void QuickSort(int A[],int left,int right){     if(left>=right){          return;     }     int pivotIndex=Partition(A,left,right);     QuickSort(A,left,pivotIndex-1);     QuickSort(A,pivotIndex+1,right);}

快速排序归并排序相似,都是通过分治策略实现的,从序列中选取一元素,作为基准(pivot),将小于基准元素的放在前面,大于基准元素的放在后面。
完成后再通过递归算法对刚才划分出来小于基准的序列和大于基准的序列进行同样的分区(partition)操作

在分区函数中,为什么我选择最后一位当作基准元素呢?(int pivot =A[right];)
是因为,这样可以减少for循环里比较的次数(i<right),更重要的原因是因为可以保证基准元素的位置在for循环中不会被交换位置,如果还是没太明白这句话的原因,可以看一下下面的代码:

public static int Partition(int A[], int left, int right){     int pivot =A[(left+right)/2];     int index=left;     for(int i=left;i<=right;i++){          if(i==(left+right)/2) continue;          if(A[i]<pivot){              int temp=A[i];              A[i]=A[index];              A[index++]=temp;          }     }     A[(left+right)/2]=A[index];     A[index]=pivot;     return index;}public static void QuickSort(int A[],int left,int right){     if(left>=right){          return;     }     int pivotIndex=Partition(A,left,right);     QuickSort(A,left,pivotIndex-1);     QuickSort(A,pivotIndex+1,right);}    输出结果:排序之前:49 38 65 97 76 13 27 49 78 34 12 64 1排序之后:1 12 13 27 34 49 49 76 76 76 97 78 78

这里我们将int pivot =A[(left+right)/2]; 当作基准元素,但是可以发现排序后的结果确实错误的,您能帮我看一下问题是发生在哪一块吗?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
//后续补充
自己挖的坑,还是自己填吧….
错误的原因是因为A[(left+right)/2]=A[index];A[index]=pivot; 交换赋值这块,虽然我们在代码中加上了判断i==(left+right)/2,跳过本次循环,来保证当前元素不主动的去与其他元素进行交换,但依然可能存在被动的被其他值进行交换,也就是当index=(left+right)/2时,所以我就不能直接的对A[(left+right)/2]进行赋值。
修改后代码:

public static int Partition(int A[], int left, int right){     int pivot =A[(left+right)/2];     int index=left;     int pivot_index=(left+right)/2;     for(int i=left;i<=right;i++){          if(A[i]<pivot){              int temp=A[i];              if(A[index]==pivot) {                   pivot_index=i;              }              A[i]=A[index];              A[index++]=temp;          }        System.out.println();        for(int i1=0;i1<A.length;i1++)        {            System.out.print(A[i1]+" ");        }     }     A[pivot_index]=A[index];     A[index]=pivot;     return index;}

修改后,排序结果恢复正常。

如果您有更好的解法,欢迎您在留言区补充,感谢!!

原创粉丝点击