快速排序

快排思想:

    通过一轮排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两个部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。如果排序数组为A[0]...A[N-1],首先取第一个数据作为中间数据,然后将所有比他小的数放到他的前面,所有比他大的数放到它的后面,即一趟快速排序。

算法如下:
static void  quicksort(int []a,int low,int high){
    if(low>=high)          //low小于或等于high直接返回
        return;
    if((high-low)==1){  //如果只有两个数字则直接比较
        if(a[low]>a[high])
            swap(a,a[low],a[high]);
        return;
    }
    int pivot=a[low];   //取第一个数作为中间数
    //左滑块当前的下标数,从第2个数字开始,右滑块当前的下标数,从最后一个数字开始
    int left=low+1;
    int right=high;
    while(left<right){
         //从左边开始找
         while(left<right&&left<=high){  //如果左小于右则一直循环
             if(a[left]>pivot) break;         //找到一个大的数字则退出
             left++;                              //左滑块右移
         }
         //从右边开始找
         while(left<=right&&right>low){ //如果左大于右则一直循环
             if(a[right]<pivot) break;      //找到一个小的数字则退出
             right--;                            //右滑块左移
         }
         if(left<right)
             swap(a,right,left);            //如果还没找完,则交换数字
    }
    swap(a,low,right);                   //交换中间数字,不影响两边的大小
    quicksort(a,low,right);            //排序前面数组
    quicksort(a,right+1,high);      //排序后面数组

}
static void swap(int []a,int i,int j){
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}

posted @ 2013-07-01 11:36  一种微笑  Views(198)  Comments(0)    收藏  举报