思想方法(分治思想)是把一个序列划分为两个子序列,使第一个子序列的所有元素都小于第二个子序列的所有元素。不断地进行这样的划分,最后构成n个序列,每个序列只有一个元素。这时,它们就是按递增顺序排序额序列了。

      方法一:

public void QuickSort(int[] arr,int low,int high)
{
      int index;
      while(low<high)
      {
            index=Split(arr,low,high);  //枢点元素的下标
            QuickSort(arr,low,index-1);
            QuickSort(arr,index+1,high);
      }
}


public int Split(int[] arr,int low,int high)
{
      int i=low;
      int k;
      int key=arr[low];
      for(k=low+1;k<=high;K++)
      {
            if(arr[k]<=key)
            {
                  i=i+1;
                  if(i!=k)
                  {
                       Swap(arr,i,k); //i<k并且k下标所在的元素小于arr[low]值,就交换
                  }
            }      
      }
      Swap(arr,low,i);
      return i;
}

public void Swap(int[] arr,int i,int j)
{
     int temp=arr[i];
     arr[i]=arr[j];
     arr[j]=temp;
}

 其实上面的条件判断还可以这样写。

if(arr[k]<=key&&++i<k)
{
   Swap(arr,i,k);
}

 方法二:

public void QuickSort(int[] arr,int low,int high)
{
     int index;
     while(low<high)
     {
            index=Split(arr,low,high);
            QuickSort(arr,low,index-1);
            QuickSort(arr,index+1,high);
     }
}

public int Split(int[] arr,int low,int high)
{
      int key=arr[low];
      while(low<high)
      {
            //从后向前搜索比key小的值
             while(arr[high]>=key&&low<high)
                  high--;
            //比key小的放前边
             arr[low]=arr[high];
            //从前向后搜索比key大的值
             while(arr[low]<=key&&low<high)
                  low++;
            //比key大的放后边
             arr[high]=arr[low];
       }
      arr[low]=key;//后边都比key大,前边都比key小 key放在枢点元素位置 此时low=high
      return low;
}

 

 posted on 2015-11-11 19:44  会飞的金鱼  阅读(139)  评论(0)    收藏  举报