快速排序学习

快速排序学习的这个版本的特点是:

1.原地排序

2.采用了分治法

3.采用递归

伪代码:

quick_sort(arr, low, high)

i <-low, j <- high;

mid <- (i+j)/2;
实现从小到大排
//设置哨兵
pivot <- arr[mid];

while i<= j
从左向右寻找大于哨兵的元素,当然小于哨兵的就是无需排序的

while arr[i] < pivot

   ++i;
从右向左寻找小于哨兵元素
while arr[j] > pivot
   --j;
把寻找到的无序值进行交换并更新i,j
if i <= j
  swap(arr[i],arr[j]);
  ++i,--j;
while循环结束的条件是i>j
进行递归
if(low < i-1)

quick_sort(arr, low, i-1)

if(i < rigth)

quick_sort(arr, i, high)

  C++实现:

#include<iostream>
//交换数据
inline void my_swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b =temp;
}
//快速排序
void quick_sort(int *arr,int low,int high)
{
	int i = low, j = high;
	int pivot = arr[(i+j)/2];
	while(i <= j)
	{
		while(arr[i] < pivot)
			++i;
		while(arr[j] > pivot)
			--j;
		if (i <= j)
		{
			my_swap(arr[i],arr[j]);
		    ++i;
		    --j;
		}
	}
	if(low < i-1)
		quick_sort(arr,low,i-1);
	if(i < high)
		quick_sort(arr,i,high);
}
//打印数组
void dis_arr(int *a, int n)
{
	std::cout << "The array is: ";
	for (int i = 0; i< n;++i)
	{
		std::cout << a[i] << " ";
	}
	std::cout << std::endl;
}
int main()
{
	int arr[] = {1,-1,90,20,8,-80,-700};
	int n = sizeof(arr)/sizeof(*arr);
	dis_arr(arr,n);
	quick_sort(arr,0,n-1);
	dis_arr(arr,n);
}


  

原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2138512.html