快速排序(单,双,三路)



/////////////////快速排序////////////////////////////////
template<typename T>
int portiTion(T arr[], int l,int r)
{
 swap(arr[l],arr[rand() % (r - l+1) + l]);
 T v = arr[l]; //设置第一个数为标志
 int j = l;   //标识正确位置的索引,初始化为l,也就是小于v的集合先设为空
 for (int i = l + 1; i <= r; i++)
  if (arr[i] < v)
  {
   swap(arr[j+1], arr[i]);
   j++;
  }  
 swap(arr[l], arr[j]); //将arr[l]标识放到正确的位置
 return j;

}


template<typename T>
void __quickSort(T arr, int l, int r)

//判断,不可少
 if (l >= r)
  return;

 int p = portiTion(arr, l, r); //返回指定的数的正确位置的索引
 __quickSort(arr, l, p - 1);
 __quickSort(arr, p + 1, r);
}


template<typename T>
void quickSort(T arr, int n)
{
 //对[0,n-1]这个闭区间进行排序
 srand(time_t(NULL));
 __quickSort(arr, 0, n - 1);
}//接口函数




///////双路快速排序////////////////////////////////////
template<typename T>
int portiTion2(T arr[], int l, int r)
{
 swap(arr[l], arr[rand() % (r - l+1) + l]);
 T v = arr[l];
 
 int i = l + 1, j = r;
 //[arr[l+1],arr[i])<v  并且 v>(arr[j],arr[r]]
 while (true)
 {
  while (i <= r && arr[i] < v) i++;
  while (j >= l + 1 && arr[j] > v) j--;
  if (i >= j)
   break;
  swap(arr[i], arr[j]);
  i++;
  j--;
 }
 swap(arr[l], arr[j]);
 return j;

}


template<typename T>
void __quickSort2(T arr[], int l, int r)
{
 if (l >= r)
  return;
 int p=portiTion2(arr, l, r);
 __quickSort2(arr, l, p - 1);
 __quickSort(arr, p + 1, r);
}


template<typename T>
void quickSort2(T arr[], int n)
{
 srand(time_t(NULL));
 __quickSort2(arr, 0, n - 1);
}





////////////三路快速排序/////////////////
template<typename T>
void __quickSort3(T arr[], int l, int r)
{
 if (l >= r)
  return;
 //portition
 swap(arr[l], arr[rand() % (r - l + 1) + l]);
 T v = arr[l];
 //初始化
 int i = l+1;
 int lt = l;//[arr[l],arr[lt]]<v;初始该区间为0
 int gt = r+1 ;//[arr[gt],arr[r]];初始该区间为0;
 while (i < gt)
 {
  if (arr[i] < v)
  {
   swap(arr[lt + 1], arr[i]);
   lt++;
   i++;
  }
  else if (arr[i] > v)
  {
   swap(arr[gt - 1], arr[i]);
   gt--;
  }
  else
   i++;
 }
 swap(arr[l], arr[lt]);
 __quickSort3(arr, l, lt - 1);
 __quickSort3(arr, gt, r);

}


template<typename T>
void quickSort3(T arr[], int n)
{
 srand(time_t(NULL));
 __quickSort3(arr, 0, n - 1);
}

猜你喜欢

转载自blog.csdn.net/gongpan2468/article/details/69607497