【常用排序算法】快速排序(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;}
修改后,排序结果恢复正常。
如果您有更好的解法,欢迎您在留言区补充,感谢!!
阅读全文
1 0
- 【常用排序算法】快速排序(Java实现)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法之快速排序、归并排序(java实现)
- Java常用排序算法之快速排序
- JAVA常用排序算法之快速排序
- 排序算法--交换排序(冒泡排序、快速排序、随机快速排序)java实现
- Java实现数组的快速排序(快速排序算法)
- 快速排序算法(java实现)
- 快速排序算法(C & Java 实现)
- 算法1-快速排序(java实现)
- 快速排序算法(java实现)
- Java快速排序(QuickSort)算法实现
- 快速排序算法学习心得(Java实现)
- 快速排序算法(Java实现)
- 快速排序算法(Java实现)
- 快速排序算法(java实现)
- java实现快速排序算法
- java实现快速排序算法
- BZOJ4027 [HEOI2015]兔子与樱花 树形dp+贪心
- hdu 1242 Rescue
- 2017/11/19
- fzu 2195 检查站点
- java 自我知识总结(十一)构造函数 继承 及类的加载顺序
- 【常用排序算法】快速排序(Java实现)
- 交大oj-1008-二哥买期货 C++ 总结
- 201403-1 相反数 ccf
- scrapy使用random user-agent的两种方式
- SpringMvc之国际化-yellowcong
- SSM框架实战系列之二_Maven之一
- HTML:使用列表
- CodeForces
- 事件监听