快速排序
快速排序是对冒泡排序的一种改进,它的基本思想在于划分,首先在序列中任选一个元素a(i),使其作为划分标准,通过交换,使得a(i)前边(左边)的元素都比a(i)小,而a(i)后边(右边)的元素都比a(i)大,
思路参考图
对快速排序的基本过程有了基本了解后,下图描述了每次划分时所进行的具体操作
快速排序通过对序列的不断划分,把原始序列以划分元素为界形成两个子序列,再对子序列重复划分过程,这显然是一个递归过程,递归的中止条件是子序列中只含有一个元素,
在每次划分的过程中,需要设置前后两个指针,这两个指针依次往序列中间位置移动,当指针重合时,结束本次划分,
看代码
#include <iostream>
using namespace std;
// 交换操作
void swap(int arr[], int low, int high)
{
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
//计算基准点的函数
//把将所有小于基准点的所有元素放在基准点的左边
//把将所有大于基准点的所有元素放在基准点的右边
int Partition(int arr[], int low, int high)
{
int point = arr[low]; //基准点定位第一个元素
while (low < high) //当退出这个循环时,low和high接触在一块
{
while (low < high && arr[high] >= point)
{
high--;
}
//比较右边,如果比基准点少,把基准点传过去,把小的数传进来
swap(arr, low, high);
while (low < high && arr[low] <= point)
{
low++;
}
swap(arr, low, high);
}
return low;
}
void Qsort(int arr[], int low, int high)
{
int point;
//左边的指针和右边的指针都会移动,当指针重叠的时候,进行一轮比较了
if (low < high)
{
point = Partition(arr, low, high);
Qsort(arr, low, point-1);
Qsort(arr, point+1, high);
}
}
void QuickSort(int arr[], int len)
{
//参数:数组,初始位置,最大元素的位置
Qsort(arr, 0, len-1);
}
int main()
{
int arr1[10]= {8, 5, 2, 6, 0, 3, 9, 1, 7, 4};
QuickSort(arr1, 10);
cout<<"快速排序后:"<<endl;
for (int i = 1; i < 10; i++)
{
cout<<arr1[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
对快排partirion()优化
优化方案一(选取更好的基准点)
通过选取更好的基准点来降低递归的深度,以此来优化算法
//优化方案1,
int Partition(int arr[], int low, int high)
{
int mid = (low +high)/2;
if (arr[low]>arr[high])
{
swap(arr, low, high);
}
if (arr[mid]>arr[high])
{
swap(arr, mid, high);
}
if (arr[low]<arr[mid])
{
swap(arr, low, mid);
}
int point = arr[low];
while (low<high)
{
while (low<high && arr[high]>=point)
{
high--;
}
swap(arr, low, high);
while (low<high && arr[low]<=point)
{
low++;
}
swap(arr, low, high);
}
return low;
}
优化方案二(减少不必要的交换)
//优化方案2,
int Partition(int arr[], int low, int high)
{
int point = arr[low];
while (low<high)
{
while (low<high && arr[high]>=point)
{
high--;
}
//swap(arr, low, high);
arr[low] = arr[high];
while (low<high && arr[low]<=point)
{
low++;
}
//swap(arr, low, high);
arr[high] = arr[low];
}
arr[low] = point;
return low;
}