快速排序

我是第一次写博客,如有不对请指正嘿嘿

 

快速排序之挖坑法:


快排其实不止一种实现方式,下面我要说的是快速排序中的挖坑法:

  挖坑法是这样的,首先,定义两个相当于指针的变量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);
  }
}

posted @ 2020-08-17 10:28  wen_t_y  阅读(58)  评论(0)    收藏  举报