java常用算法之快速排序
2018-03-11 12:06
411 查看
快速排序的思想:用分治的策略,将数组分的越来越小,再每组中来比较数组元素之间的大小
快速排序的实现方式:
1.分别设置两个指针来指向数组的首元素和尾元素
2.一般将数组的首元素来作为一个枢纽元素(也就是其他的元素需要跟这个元素来比较大小,比这个元素大的需要放在它的右边,比它小的需要放在这个元素的左边)
3.采用递归的思想来实现上述两步。
快速排序的实现代码:
public class fastSort {
public static Integer position(int[] a,int low,int high){
//存储枢纽值
int temp = a[low];
while(low<high){
//从后向前扫描的条件
while(high>low&&a[high]>temp){
high--;
}
//跳出来说明high<low||a[high]<temp;
a[low] = a[high];
//从前向后扫描的条件
while(low<high&&a[low]<temp){
low++;
}
//跳出来说明low》high||a[low]>temp;
a[high] = a[low];
//将temp归为
a[low] = temp;
}
//跳出来说明low和high相同
return low;
}
public static void sort(int[] a,int low,int high){
if(low>=high){
return;
}
int position = position(a,low,high);
//进行递归
sort(a,low,position-1);
sort(a,position+1,high);
}
public static void main(String[] args) {
int[] a = {5,4,3,2,1};
fastSort.sort(a, 0, a.length-1);
for(int s : a){
System.out.println(s);
}
}
}
1.low指针和high指针 在最开始都是指向数组头和数组尾的,枢纽元素在low指针所指向的位置。
2.若a【high】< 枢纽 ,此时a[low]所代表的地址空间是指向枢纽的,a【low】 = a【high】是将小于枢纽的元素移到了相应的位置,注意此时我们并没有交换枢纽的位置,按照交换规则我们知道枢纽应该放在a【high】的位置,这样枢纽就和被交换元素之间交换了位置。
3.通过第二部分析我们知道,其实枢纽每次需要交换的位置就是a[low]或者a[high]的位置。
希望我的思路可以帮助大家理解,因为我在学习快排的时候就不懂这里,所以分享出来帮助不懂的人来理解。有不正确的地方请大家指正!
快速排序的实现方式:
1.分别设置两个指针来指向数组的首元素和尾元素
2.一般将数组的首元素来作为一个枢纽元素(也就是其他的元素需要跟这个元素来比较大小,比这个元素大的需要放在它的右边,比它小的需要放在这个元素的左边)
3.采用递归的思想来实现上述两步。
快速排序的实现代码:
public class fastSort {
public static Integer position(int[] a,int low,int high){
//存储枢纽值
int temp = a[low];
while(low<high){
//从后向前扫描的条件
while(high>low&&a[high]>temp){
high--;
}
//跳出来说明high<low||a[high]<temp;
a[low] = a[high];
//从前向后扫描的条件
while(low<high&&a[low]<temp){
low++;
}
//跳出来说明low》high||a[low]>temp;
a[high] = a[low];
//将temp归为
a[low] = temp;
}
//跳出来说明low和high相同
return low;
}
public static void sort(int[] a,int low,int high){
if(low>=high){
return;
}
int position = position(a,low,high);
//进行递归
sort(a,low,position-1);
sort(a,position+1,high);
}
public static void main(String[] args) {
int[] a = {5,4,3,2,1};
fastSort.sort(a, 0, a.length-1);
for(int s : a){
System.out.println(s);
}
}
}
程序中不需要每次都将枢纽元素放在数组中,只需要每趟遍历结束后,
放在low=high的位置就好了
解释下a[low] = a[high]或者a[high] = a[low]的意思说明一下:因为其实快速排序每次的交换是需要枢纽元素和被交换元素之间交换位置的,所以我们也就需要知道枢纽每次被交换的位置,但其实我们在程序中并没有在每次交换都将枢纽元素放在相应的位置,而是在每趟结束之后,在交换。所以解释如下:
1.low指针和high指针 在最开始都是指向数组头和数组尾的,枢纽元素在low指针所指向的位置。
2.若a【high】< 枢纽 ,此时a[low]所代表的地址空间是指向枢纽的,a【low】 = a【high】是将小于枢纽的元素移到了相应的位置,注意此时我们并没有交换枢纽的位置,按照交换规则我们知道枢纽应该放在a【high】的位置,这样枢纽就和被交换元素之间交换了位置。
3.通过第二部分析我们知道,其实枢纽每次需要交换的位置就是a[low]或者a[high]的位置。
希望我的思路可以帮助大家理解,因为我在学习快排的时候就不懂这里,所以分享出来帮助不懂的人来理解。有不正确的地方请大家指正!
相关文章推荐
- 常用算法Java实现之快速排序
- JAVA常用排序算法之快速排序
- java常用算法
- Java常用排序算法之堆排序
- java常用算法之逆波兰表达式(Evaluate Reverse Polish Notation)
- java常用算法之最长回文子串(Longest Palindromic Substring)
- Java算法排序之--冒泡排序、快速排序
- Java:常用标准库算法
- JAVA常用算法-杨辉三角
- 一步步学习数据结构和算法之快速排序效率分析及java实现
- 通过Java实现一种常用的权限控制算法
- 图的常用算法的java实现
- java常用算法之堆排序
- java 集合(3) set 接口/ set 常用算法
- 轻松学算法3:最常用的排序——快速排序
- Java学习资料-Java常用算法-堆排序
- java中常用的摘要算法
- 【JAVA】常用加解密算法总结及JAVA实现【BASE64,MD5,SHA,DES,3DES,AES,RSA】
- Java常用算法——冒泡排序
- java例程练习(List常用算法)