使用java实现快速算法
快速排序是一种基于分而治之的排序算法,其中:
1、通过从数组中选择一个中心元素将数组划分成两个子数组,在划分数组时,将比中心元素小的元素放在左子数组,将比中心元素大的元素放在右子数组。
中心元素:也叫枢轴元素、基元,基准元素,这里就叫做中心元素。简单来说就是一个对照的数。
2、左子数组和右子数组也使用相同的方法进行划分,这个过程一直持续到每个子数组都包含一个元素为止。
3、最后,将元素组合在一起以形成排序的数组。
快速排序算法的工作原理
以一个数组为例:[6,1,2,7,9,3,4,5,10,8]
1.首先选择一个中心元素,选取的中心元素不同,算法也会有所不同。这里以选择第一元素为例。
[6,1,2,7,9,3,4,5,10,8]
(1)首先,定义两个变量,用于指向数组的头和尾,并将中心元素赋值给中间变量。
int low=0,height=9,temp;
temp=arr[low];
(2)然后,先从右边往左边开始,找到一个比中间元素6小的数,然后从左边往右边找,找到一个比6大的数,然后将这两个数进行交换。直到low > height,然后将arr[height]的值与中间元素进行交换。
为什么不拿arr[low],因为比较的时候,low下标代表的值就是比中间元素小的,而到最后一次的时候(low > height),说明height下标的值才是比中间元素小的,因此将arr[height]的值与中间元素进行交换。
第一次:
从右往左:5比6小,height指在5的位置
从左往右:7比6大,low指在7的位置
下标为low和height的元素进行交换
[6,1,2,5,9,3,4,7,10,8]
由于low<height,因此继续进行,只要从右边往左找到一个数小于6的,左边往右找到一个数大于6的,就交换两数。直到low > height 为止。
然后
arr[start]=arr[end];
arr[end]=temp;
这时,中间元素的左边将是比中间元素小的数,右边都是比中间元素大的数。
最后,执行下面两条语句,进行递归:
quick(arr,low,height-1);
quick(arr,height+1,end);
quick(arr,low,height-1);
进行第一次后,得到的中间元素的左边都是混乱,不过都是比中间元素小的数。将左边部分的子数组元素的low,height传进quick方法里面进行上面的操作,最后得到的就是从小到大排好的数。
quick(arr,height+1,end);同上述解释quick(arr,low,height-1);一样的原理,只不过传的是右边子数组的low,height。
代码实现:
import java.util.Scanner;
public class Quick {
public static void main(String[] args) {
System.out.println("请输入10个整数:");
Scanner sc = new Scanner(System.in);
int[] n=new int[10];
for (int i = 0; i < n.length; i++) {
n[i]=sc.nextInt();
}
quick(n,0,n.length-1);
for (int i = 0; i < n.length; i++) {
System.out.print(n[i]+" ");
}
}
public static void quick(int[] arr,int low,int height){
int start,end,temp,temps;
if (low>height){
return;
}
start=low;
end=height;
temp=arr[start];
while (start<end){
while (temp<arr[end] && start<end){
end--;
}
while(temp>arr[start] && start<end){
start++;
}
if (start<end){
temps=arr[end];
arr[end]=arr[start];
arr[start]=temps;
}
}
arr[start]=arr[end];
arr[end]=temp;
quick(arr,low,height-1);
quick(arr,height+1,end);
}
}
实现结果: