ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

十大排序算法之快速排序

十大排序算法之快速排序 一.概念通过一趟排序将要排序的数据分割成独立的两部分其中一部分的所有数据都比另外一部分的所有数据都要小然后再按此方法对这两部分数据分别进行快速排序整个排序过程可以递归进行以此达到整个数据变成有序序列。二.步骤1、首先设定一个分界值通过该分界值将数组分成左右两部分。2、将大于或等于分界值的数据集中到数组右边小于分界值的数据集中到数组的左边。此时左边部分中各元素都小于或等于分界值而右边部分中各元素都大于或等于分界值。3、然后左边和右边的数据可以独立排序。对于左侧的数组数据又可以取一个分界值将该部分数据分成左右两部分同样在左边放置较小值右边放置较大值。右侧的数组数据也可以做类似处理。4、重复上述过程可以看出这是一个递归定义。通过递归将左侧部分排好序后再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后整个数组的排序也就完成了。三.图示示例快速排序主要有三个参数left 为区间的开始地址right 为区间的结束地址Key 为当前的开始的值。从待排序的记录序列中选取一个记录通常第一个作为基准元素称为keykeya[left]然后设置两个变量left指向数列的最左部right 指向数据的最右部key6565588810613left right第一步:key 首先与 a[right] 进行比较如果 a[right]key则a[left]a[right]将这个比key小的数放到左边去如果a[right]key则我们只需要将right--right--之后再拿a[right]与key进行比较直到a[right]key交换元素为止。key65135888106left right第二步如果右边存在a[right]key的情况将a[left]a[right]接下来将转向left端拿a[left ]与key进行比较如果a[left]key,则将a[right]a[left]如果a[left]key则只需要将left,然后再进行arr[left]与key的比较。key65135888106left right135888106left right135810688left right第三步然后再移动right重复上述步骤。key6513586510688left right第四步最后得到 {13 85} 65 {106 88 }再对左子数列与右子数列进行同样的操作。最终得到一个有序的数列。13 {58} 65 {88} 10613 58 65 88 106import java.util.*; import static java.util.Collections.swap; public class Main { public static void main(String[] args) { Scanner scan new Scanner(System.in); int n scan.nextInt(); int[] a new int[n]; for (int i 0; i n; i) { a[i]scan.nextInt(); } int xa.length-1; partition(a,0,x); for (int i 0; i n; i) { System.out.print(a[i] ); } } public static int[] partition(int[]a,int left,int right){ int xa[left]; int i left; int j right; while (ij) { while ((ij)(a[j]x)) { j--; } while ((ij)(a[i]x)) { i; } if ((ij)(a[i]a[j])) { i; } else { int temp a[i]; a[i] a[j]; a[j] temp; } } if (i-1left)apartition(a,left,i-1); if (j1right)apartition(a,j1,right); return (a); } }
返回列表