快速排序:
快速排序是对冒泡排序的一种改进。
基本思想:
通过一趟排序将要排序的数据分割成独立的俩部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这俩部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
动态图解:
Java代码实现:
import java.util.Scanner;
public class Quick_sort {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入数组的大小:");
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int [] arr = new int[a];
for(int i = 0;i<arr.length;i++) {
System.out.println("请输入数组的第"+i+"个值:");
int s = input.nextInt();
arr[i] = s;
}
arr = QuickSort(arr);
for(int i = 0;i<arr.length;i++)
System.out.print(" "+arr[i]+" ");
}
public static int[] QuickSort(int[] arr) {
//快速排序:
//分治法!
//基本思想:选择第一个数为k,小于k的数放在左边,大于k的数放在右边。
//递归的将小于基准值的元素和大于基准值的元素进行排序。直到不能递归。
//查找中轴、递归排序
if(arr.length>0)
Quick(arr,0,arr.length-1);
//直到分组后的数组大小为1
return arr;
}
//对数组进行分组,并调用排序算法,对分好的组分别进行排序
public static void Quick(int[] arr,int start,int end) {
if(start < end)
{
//将numbers数组进行一分为二
int middle = Middle(arr,start,end);
//对低字段表进行递归排序
Quick(arr, start, middle-1);
//对高字段表进行递归排序
Quick(arr, middle+1, end);
}
}
//将传递进来的数组进行排序,
public static int Middle(int[] arr,int start,int end) {
//查找出中轴(默认是最低位low)的在arr数组排序后所在位置
//arr 待查找数组
//start 开始位置
//end 结束位置
//mid 中轴所在位置
//数组的第一个作为中轴
int temp = arr[start];
//判断数组是否合法
while(start < end)
{
//从后往前遍历数组,如果数值大于作为中轴的数值,则往前继续查找,直到找到第一个小于中轴的数或者start>end
while(start < end && arr[end] > temp)
{
end--;
}
//比中轴小的记录移到低端
arr[start] = arr[end];
//从前往后遍历数组,如果数值小于作为中轴的数值,则继续往后查找,直到找到第一个大于中轴的数或者start>end
while(start < end && arr[start] < temp)
{
start++;
}
//比中轴大的记录移到高端
arr[end] = arr[start] ;
}
//中轴的数值给最后空出的位置
arr[end] = temp ;
//将中轴的位置的下标返回,左边的数是小于中轴的,右边的数是大于中轴的。对左右俩遍进行递归排序
return start;
}
}