快速排序思想:
设k=a[0](取基准元素),将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k的右边,和k相等的,在k的左右均可。然后再把k的左边的元素和右边的元素按照同样的方式进行排序。
时间复杂度:n*logn
空间复杂度:1
和归并排序比较,快速排序比归并排序更加节省空间,但是快速排序的稳定性要比归并排序差。
这里快排的代码没有对基准元素进行优化,属于最原始的快排代码。在快排的单数组比较的代码中,给了2种对比的方式。
代码:
#include <iostream>
using namespace std;
void QuickSort(int arr[], int left, int right);//快排1
void QuickSort2(int arr[], int left, int right);//快排2
void swap(int& a, int& b);
int main()
{
int arr[] = { 15,6,11,7,5,99,22,3,2,67,45,12,23,1,43,55,0,8,17,58 };//初始待排序数组
int size = sizeof(arr) / sizeof(int);
int left = 0, right = size - 1;
QuickSort(arr, left, right);
for (int i = 0; i < size; i++)//输出arr数组
cout << arr[i] << " ";
return 0;
}
void QuickSort(int arr[], int left, int right)
{
if (left < right)//这个部分的条件判断与归并排序相同0
{
int key = arr[left];
int i = 0 + left;//指向key位置的指针
int j = 1 + left;//指向进行判断的数字的位置
while (j<=right)
{
if (key > arr[j] && j - i > 1)//前提是i-j>1
{
swap(arr[j],arr[i+1]);//当前i所指的数与key后一个数进行替换
swap(arr[i],arr[i+1]);//key的位置与key后一个数进行替换
i++;
j++;
}
else if (key > arr[j])
{
swap(arr[i], arr[j]);
i++;
j++;
}
else
j++;
}
QuickSort(arr, left, i-1);
QuickSort(arr, i+1,right);
}
}
void swap(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void QuickSort2(int arr[], int left, int right)
{
if (left >= right)
return;
int key = arr[left];
int i = left;//指向key位置的指针
int j = right;//指向进行判断的数字的位置
while (i!=j)
{
if (key < arr[j])
j--;
else
{
swap(arr[i + 1], arr[j]);
swap(arr[i], arr[i + 1]);
i++;
}
}
QuickSort2(arr, left, i-1);
QuickSort2(arr, i+1, right);
}