源码:
- public static int getMiddle(int[] list, int low, int high) {
- int tmp = list[low]; // 数组的第一个值作为中轴(分界点或关键数据)
- while (low < high) {
- while (low < high && list[high] > tmp) {
- high--;
- }
- // 比中轴小的记录移到低端
- while (low < high && list[low] < tmp) {
- low++;
- }
- if(high<low){
- int temp=list[high];
- list[high] = list[low]; // 比中轴大的记录移到高端
- list[low]=temp;
- }
- }
- list[low] = tmp; // 中轴记录到尾
- return low; // 返回中轴的位置
- }
- public static void unckSort(int[] list,int low,int high) {
- if(low < high) {
- int middle = getMiddle(list,low,high); // 将list数组一分为二
- unckSort(list,low,middle-1); // 对低字表进行递归排序
- unckSort(list,middle+1,high); // 对高字表进行递归排序
- }
- }
- public static void quick(int[] str) {
- if(str.length > 0) {
- // 查看数组是否为空
- unckSort(str,0,str.length-1);
- }
- }
- int[] number={13,15,24,99,14,11,1,2,3};
- System.out.println("排序前:");
- for(int val:number) {
- System.out.print(val+" ");
- }
- quick(number);
- System.out.println("\n排序后:");
- for(int val:number) {
- System.out.print(val +" ");
- }
-
排序前: 13 15 24 99 14 11 1 2 3 排序后: 1 2 3 11 13 14 15 24 99
- 此上源代码转载C语言中文网
- 开始正文:
- 23行至26行从这里作为入口进行值的录入(顺便看是否为空数组;即长度为0的,元素为空),str ,0,str.length-1;分别代表着数组,这个数组第一个元素,这个数组的最后一个元素。
- 第2行把数组的第1个元素赋值到整型tmp中,拿tmp元素作为关键数据进行比对,然后通过While循环对数组进行遍历分析,他的循环条件是最后一个元素,大于第一个元素(及关键数据),其中又有两个while循环体我们先说第一个。他的循环条件有两个第一个条件是:最后一个元素,大于第一个元素。这与大循环条件一至,第二个循环条件是最后一个元素的值大于tmp的值,有人会问为什么不直接用low(数组第一个元素)进行比较,因为这个Low已经不是作为储存元素的数组了,他现在的作用是比较器。他是从头端,从前往后进行比较,而high作为末端,从末往前进行比较。直到他俩不满足第一层while循环条件时退出。
- 现在来讲,4至7行代码意思high大于tmp的值,那么他便前进一步即从最后一个变成了倒数第二个了high--嘛,从后往前进行遍历。8至9行代码意思是满足low元素若小于tmp元素,那吗low元素便逐渐从前往后遍历。直到遇到一种情况,也就是11行到14行的内容。high索引小于tmp,而low索引大于tmp则high和low这两个索引互换形成新的low索引和high索引。最后他们通过20行到25行递归的方法实现再底字端和高字段的的排序。
- 最后就得到了排序好的数组。