快速排序
快排思想:
通过一轮排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两个部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。如果排序数组为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;
}

浙公网安备 33010602011771号