快速排序学习
快速排序学习的这个版本的特点是:
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);
}

浙公网安备 33010602011771号