A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

设计一个快速排序的算法:对"12,34,16,24,8,21,26,11,29,16"排序。
* 思路分析:
* 1、首先选定一个元素作为参数,保证该参数位于数组的中间,比该参数大的位于该参数所在
* 数组位置的右边,比该参数小的位于该参数所在数组位置的左边。
*                
* 2、位于该参数左边的数组递归调用上述方法,直至数组有序。该参数右边的数组同理。
*
* @author admin
*
*/
public class Quicksor{

        /**
         * @param args
         */
        public static void main(String[] args) {
                //arr表示我们要排序的数组了
                int[] arr={12,34,16,24,8,21,26,11,29,16};
                //输出未排序前的数组,与排序后的数组作比较
                for (int i = 0; i < arr.length; i++) {
                        System.out.print(arr[i]+" ");
                }
                System.out.println();
                //设置连个变量当作指针分别指向数组arr[0]元素的下标和arr[arr.length-1]元素的下标
                int left=0,right=arr.length-1;
                //调用quickSor()函数使数组有序
                quickSor(arr,left,right);
                //输出排序后的数组,检测我们的成果
                for (int i = 0; i < arr.length; i++) {
                        System.out.print(arr[i]+" ");
                }
        }

        private static void quickSor(int[] arr, int left, int right) {
                //递归调用应满足数组下标left的值小于right
                if(left<right){
                        //获取参数数组元素在有序数组中的位置
                        int q=sorNum(arr,left,right);
                        //递归调用quickSor()函数保证数组有序
                        quickSor(arr,left,q-1);
                        quickSor(arr,q+1,right);
                }
        }
        //获取参数数组元素在有序数组中的位置的函数
        public static int sorNum(int[] arr,int left,int right){
                //定义canshu变量并赋值位arr[left]
                int  canshu=arr[left];
                //循环调用的条件:左指针对应元素的下标应小于右指针对应元素的下标
                while(left<right){
                        /**
                         * 在满足函数条件的情况下,如果参数大于右指针所对应的元素,右指针对应元素的下标减一
                         * 并将右指针对应的元素赋值给左指针
                         */
                        while(left<right&&canshu<=arr[right])   --right;
                                arr[left]=arr[right];
                        /**
                         * 在满足函数条件的情况下,如果参数大于左指针所对应的元素,左指针对应元素的下标加一
                         * 并将左指针对应的元素赋值给右指针
                         */
                        while(left<right&&canshu>=arr[left])   ++left;
                                arr[right]=arr[left];
                }
                //当跳出while循环时,此时左右指针同时指向同一元素。并把参数赋值给此元素
                arr[left]=canshu;
                return  left;
        }

}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马