学习笔记之快速排序法 --java

来源:互联网 发布:中等收入陷阱国家 知乎 编辑:程序博客网 时间:2024/05/16 08:32

今天看视频,看到在讲快速排序法,就想自己动手写一下程序,可惜脑子不够灵活,写了半天,也只把第一次排序写明白,后来到百科上看到了实现了程序,一看就慌了,完全没有想到会用到递归调用。下面把代码贴过来,写上自己的理解,以便以后用。

package wtts20131227;


public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
        
int arr[]={1,6,0,-1,9,3,5,-5,2,8,11,-2};
/*Bubble bubble = new Bubble();
bubble.sort(arr);*/
QuickSort quickSort=new QuickSort();
quickSort.sort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+"  ");
}




}
}
class Bubble
{
//冒泡排序
    //外层循环
public void sort(int arr[])
{
int temp;
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])
  {
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
  }
 }
}
}
}
class QuickSort
{
public void sort(int arr[],int start,int end)//毋庸置疑,第一个参数是要排序的数组,                                                                                
                                         //第二、三个参数是开始和 结束排序元素的数组的下标
{
int i,j,temp;   //之所以定义两个变量分别存放start和end,是因为1、递归调用时要用到                                                        
                        //start和end中的值,所以在执行中不能修改它们的值 2、下面的程序要用
                        //到start和end的 值,且需要对这个值进行自加、自减运算  
i=start;
j=end;
if((arr==null)||(arr.length==0)) return;//首先判断数组是否存在和数组的长度是否为0,
                                   //数组不存在或长度为0,程序结束
while(i<j)
{
while(i<j&&arr[i]<=arr[j]) //以start为下标的元素扫描数组,直到遇到一个数
                      //大于arr[start]或i<j,循环结束
{
j--;
}
if(i<j)                   //判断上面循环是以哪种形式结束的,若是以遇到一个数
                     //大于arr[start]结束,交换两个数的位置
{
temp=arr[i];
arr[i] = arr[j];
                arr[j] = temp;
}
while(i<j&&i<j&&arr[i]<arr[j]){    //左侧扫描(此时a[j]中存储着key值)
                 i++;
               }
             if(i<j){                 //找出第一个比key大的,交换位置
                 temp = arr[i];
                 arr[i] = arr[j];
                 arr[j] = temp;
             }
}
if(i-start>1){
            //递归调用,把key前面的完成排序 
//一开始一直纠结为什么这样调用就可以把key前面的完成排序,一直没想到调用这个                                              
            //函数时若满足条件,二次排序后,也可以调用 sort(arr,i+1,end),⊙﹏⊙b汗
           sort(arr,start,i-1);
       }
       if(end-i>1){
           sort(arr,i+1,end);    //递归调用,把key后面的完成排序
       }
}
}


0 0
原创粉丝点击