快速排序
我是第一次写博客,如有不对请指正嘿嘿
快速排序之挖坑法:
快排其实不止一种实现方式,下面我要说的是快速排序中的挖坑法:
挖坑法是这样的,首先,定义两个相当于指针的变量low和high,分别指向要排序数组最左边角标和最右边角标,再将最左边元素的值给一个变量mid,然后进入循环,只要low<high,就说明两边指针没有碰面,就继续循环。
然后就是进入到循环内了,再写个循环判断,high坐标位置元素值如果大于mid,high--。否则就跳出循环,把high坐标位置的元素值赋给mid坐标位置的数组元素,再进入下个次循环,如果low坐标位置的元素值小于high位置的值,low++,否则就跳出循环,把low位置的元素值赋给high坐标位置。
就这样,在最开始的那个循环中一直循环,直到low<high不成立,就说明数组已经走了一遍了,那就把最开始mid的元素放到low或者high坐标位置,由于能退出循环,所以肯定是low=high,所以mid给谁都行。
经过上面的操作之后,就会有一个元素归位,所以,只要我们再来几次递归调用,就能排好序了。
下面的代码是排好一个元素的代码:
static int 准备(int arr[],int low,int high)
{
int mid=arr[low];//把low位置的元素值赋值给mid
while (low<high)//能进去就说明low和high没有碰面,也就是没有走完一遍数组
{
while (low<high&&arr[high]>=mid)//满足条件,就减小high
{
high--;
}
arr[low]=arr[high];//跳出循环就是说明low位置的数比high位置的大或者low=high了,由于我们最开始将low位置数放到了mid中也保存,所以不用担心丢失
while (low<high&&arr[low]<=mid)//满足条件,就low--
{
low++;
}
arr[high]=arr[low];//跳出循环就说明low位置数比high位置的数还大或low=high
}
arr[low]=mid;//最后将mid放到low或high的位置,也就是排好一个值了
return low;//然后返回当前位置,让他递归的时候只递归没有拍好序的部分
}
下一个方法,递归调用:
static void 快速排序(int arr[],int low,int high){
if(low<high){//
int index=准备(arr,low,high);
快速排序(arr,low,index-1);
快速排序(arr,index+1,high);
}
}

浙公网安备 33010602011771号