黑马程序员技术交流社区

标题: 谁有快速排序的正确代码? [打印本页]

作者: JJJD    时间: 2015-6-25 19:08
标题: 谁有快速排序的正确代码?
请问谁有快速排序的正确代码?谢谢了!
作者: keto    时间: 2015-6-25 20:04
/*
* 冒泡排序:将每个元素取出,跟相邻的元素进行比较,如果从小到大排序,判断当前元素如果大于相邻元素,则进行交换。      
*/
public class Demo {
        public static void main(String[] args) {
                int[] arr = {3,24,32,36,7,8};
               
                //冒泡排序
                for(int i = 0; i < arr.length - 1 ; i++){//外层循环控制循环次数
                        for(int j = 0 ; j < arr.length - 1 - i ; j++){//内层循环用于取数字,并比较
                                if(arr[ j ] > arr[ j + 1] ){
                                        //交换
                                        int temp = arr[ j ];
                                        arr[ j ] = arr[ j + 1];
                                        arr[ j + 1] = temp;
                                }
                        }
                }
                printArray(arr);
        }
       
        public static void printArray(int[] arr){
                for(int i = 0;i < arr.length ; i++){
                        System.out.println(arr[i]);
                }
        }
}

/*
* 选择排序:
*
* 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
*/
public class Demo {
        public static void main(String[] args) {
                int[] arr = {88,45,75,20,10};
                //方式一:比较一次,就交换一次。由于有很多的无效交换,所以效率低。
                /*for(int i = 0;i < arr.length - 1 ; i++){
                        for(int j = i + 1 ; j < arr.length ; j++){
                                //判断如果i > j的数,就交换
                                if(arr[i] > arr[j]){
                                        //交换
                                        int temp = arr[i];
                                        arr[i] = arr[j];
                                        arr[j] = temp;
                                }
                        }
                }
                printArray(arr);*/
               
                //方式二:先进行判断,并寻找最小数,找到后,不交换,只记录索引值。每个数都遍历了之后,每一轮的最后只进行一次交换。
               
                //实际上,上边的实现方式,有很多无效的交换:这种交换,不是最终的结果。
                //大家考虑:实际上每一轮都是找最小数的过程,找到后,跟第一个数一交换,只要保证第一个数是最小的就可以。
                for(int i = 0;i < arr.length - 1 ;i ++){
                        //思路:找最小的数,然后把最小数的索引记录下来,最后再进行交换
                        int minIndex = i;//假设第一个数就是最小的,将索引记录下来
                        for(int j = i + 1; j < arr.length ; j++){
                                if(arr[minIndex] > arr[j]){
                                        //不交换,把索引记录下来
                                        minIndex = j;
                                }
                        }
                        //内部的j循环一结束,minIndex记录的就是最小数的索引
                        if(minIndex != i){//有其它更小的数,执行交换
                                int temp = arr[i];
                                arr[i] = arr[minIndex];
                                arr[minIndex] = temp;
                        }
                }
               
                printArray(arr);
               
        }
        public static void printArray(int[] arr){
                for(int i = 0;i < arr.length ; i++){
                        System.out.println(arr[i]);
                }
        }
}

作者: jx5785749    时间: 2015-6-25 21:40
本帖最后由 jx5785749 于 2015-6-25 21:41 编辑

package src;

public class QSort
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO 自动生成方法存根
        quicksort qs = new quicksort();
        int data[] = {44,22,2,32,54,22,88,77,99,11};
        qs.data = data;
        qs.sort(0, qs.data.length-1);
        qs.display();
    }

}


class quicksort
{
    public int data[];
     
    private int partition(int sortArray[],int low,int hight)
    {
        int key = sortArray[low];
         
        while(low<hight)
        {
            while(low<hight && sortArray[hight]>=key)
                hight--;
            sortArray[low] = sortArray[hight];
            
            while(low<hight && sortArray[low]<=key)
                low++;
            sortArray[hight] = sortArray[low];
        }
        sortArray[low] = key;
        return low;
    }
     
    public void sort(int low,int hight)
    {
        if(low<hight)
        {
            int result = partition(data,low,hight);
            sort(low,result-1);
            sort(result+1,hight);
        }
         
    }
     
    public void display()
    {
        for(int i=0;i<data.length;i++)
        {
            System.out.print(data);
            System.out.print(" ");
        }
    }
}

作者: 我是隔壁老王呀    时间: 2015-6-25 22:06
给你一份链接,是关于我关于快速排序的理解,以及详细代码分析。
快速排序算法
作者: JJJD    时间: 2015-6-26 11:50
谢谢大家了,学习啦。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2