再次学习快速排序

 

快速排序已经看过好几遍了,经常因为小的bug,写错程序,为了以后少犯类似的错误,在这记下来。

快速排序的原理比较简单,运用递归的思想,每次用一个元素将原来的数组进行分割,关键是找对分割的位置。将前后两部分分割成小于分割元素和大于分割元素,然后递归对前后两部分继续快速排序

两部分代码:

第一部分是快速排序的整体思想:

public static void quicksort(int[] list){
         quicksort(list,0,list.length-1);
    }

    private static void quicksort(int[] list, int low, int high) {
        if(low<high){
            int index = partition(list,low,high);
            quicksort(list,low,index-1);
            quicksort(list,index+1,high);
        }

    }

第二部分是找分割的位置:

经常犯错误的地方:在判断privot与list[low]list[high]时,丢掉“=”的判断,

private static int partition(int[] list, int first, int last) {
        int privot = list[low];
        int low= first+1;     int high = last;
        while(low<high){
            while(low<=high&&privot>=list[low]){
                low++;
            }
            while(low<=high&&privot<list[high]){
                high--;
            }
            if(low<high){
                int temp = list[low];
                list[low] = list[high];
                list[high] = temp;
            }
        }
        if(privot>list[high]){
            list[first] = list[high];
            list[high] = privot;
            return high;
        }else{
            return first;
        }
    }

测试类:

public static void main(String[] args) {
        int[] list = {2,3,2,5,6,1,-2,3,14,12};
        quicksort(list);
        for(int i:list){
            System.out.print(i+" ");
        }
    }

再次学习快速排序

时间: 2024-10-25 06:16:33

再次学习快速排序的相关文章

再次学习快速排序(C语言)

#include <stdio.h> void QuickSort1(int *s,int left,int right) { int i,j,t,pivot; if(left>right) return; if(left<right) { pivot = s[left]; //基准数 i=left; j=right; while(i!=j) { while(i<j &&s[j]>=pivot) j--; //从右向左找第一个比基准数小的数 while(

再次学习javascript中的参数传递

javascript中的所有函数的参数传递都是按照值传递的,做了下面测试: function addTen(num){ num +=10; return num; } var count = 20; var result = addTen(count); alert(cont); //20 alert(result); //30 好吧,上面只是做了基本类型的传递,再做个引用类型的传递看看: function setName(obj){ obj.name="Mark"; } var pe

yii学习 再次学习

记得去年夏天第一次接触yii,不经意间就过去了一年,再次看yii.这一年发生了很多事,停顿了好久,做了好多别的事. 不过回头看看,我好像是很慢的那种 我的学习程度估计还没有那四个月的感觉...继续努力

Spring再次学习(4)

时隔一年多,在掌握了Spring.SpringBoot.SpringCloud之后 我再次回头,重新学习Spring框架 Bean的生命周期学习: 在传统的XML配置中,可以这样自定义初始化和销毁方法: init-method="" destroy-method="" 注解方式的简单使用: @Configuration public class LifeCircleConfig { @Bean(initMethod = "init",destro

学习快速排序和二分查找算法

1. 快速排序的思想采用的是分治算法实现,从头选择一个元素是作为"哨兵元素",然后从尾部开始寻找一个比"哨兵元素"小的元素,然后跟它交换,接着从头开始寻找比"哨兵元素"大的:元素,然后交换,直到"哨兵元素"的左边都"哨兵元素"小,右边都比"哨兵元素"大为止,这算是一次划分,快速排序是要经过的 k-1趟(假设有k个元素)划分才能排序好所有的元素. 下面根据分治实现的java代码: publ

经典算法学习——快速排序

快速排序应该算是在面试笔试中最常用的算法了,各位面试官都非常喜欢.排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,其中的思想也是用了分治法和递归的思想.示例代码上传到:https://github.com/chenyufeng1991/QuickSort 算法的基本思想是: (1)先从数列中取出一个数作为基准数(常常选第一个数): (2)分区过程,比这个数大的数放到它的右边,小于或等于的数全放到它的左边: (3)再对左右区间重复第二步,直到每个区间只有一个数位置,即左边

2014.10.5 再次学习LINUX

mesg 发送信息给root y n write/talk 写消息给 wall 给所有用户发送消息 ps -aux ps -elF pstree 命令行跳转:CTRL+a行首 CTRL+e行尾 CTRL+u清除光标左侧至开头 CTRL+k清除光标右侧至结尾 CTRL+左右键 history -c 清除所有命令 history -d 500 10 从第500个历史开始 删除10个命令记录 tr 'a-z' 'A-Z' 替换命令 wc -l grep --color -i -v显示没有被模式匹配到的

MVC再次学习1

1.0 匿名函数和匿名类: internal delegate int AddDel(int a, int b); //泛型委托 delegate T Demo<T>(int a,int b); delegate T Demo2<T,T1>( T1 a, int b); //Func Action 区别:Action就是没有返回值 Func有返回值 ,传人参数一共有16个 class Program { static void Main(string[] args) { #regi

Javascript学习笔记(函数---再次学习)

1.函数的定义 2.函数的递归调用 3.闭包 1.函数的定义有两种: 第一种:函数声明 function functionName(arg0,arg1,arg2){ //函数体 } 函数声明,一个重要特征是函数声明提升,即在执行代码之前会先读取函数声明. 第二种:使用函数表达式 var functionName = function(arg0,arg1,arg2){ //函数体 }; 函数表达式与其他表达式一样,在使用前必须先赋值. 两种创建方式的区别:函数声明的方式创建函数会使函数声明提升.