活动地址:CSDN21天学习挑战赛
一.快速排序
1.简介
快速排序(英文名:Quicksort)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,它可以比主要竞争对手的归并排序和堆排序快上大约两三倍。
2.逻辑分析
- 文字分析
快速排序其实是冒泡排序的一种改进,主要算法思想是待排序的n个元素,以首元素为基准,将n个元素分为三组,第一组里面的元素小于或等于基准值,第二组为基准值的数据,第三组里面的元素大于后等于基准值;此为第一趟分割,然后将第二组和第三组重复上述步骤,依次逻辑下去,直到第二组和第三组里面的元素只有一个为止。
- 动图分析
快速排序
3.代码
- 算法代码
int qusort(int s[], int start, int end)
{
int i = start;
int j = end;
int tmp = s[start]; //tmp为基准
while (i < j)
{
while (i < j && tmp < s[j]) //比基准大
{
j--; //左移
}
if (i < j) //比基准小,放左边
{
s[i] = s[j];
i++; //右移
}
while (i < j && tmp >= s[i]) //比基准小
{
i++;
}
if (i < j) //比基准大,放右边
{
s[j] = s[i];
j--; //左移
}
}
s[i] = tmp; //将基准插入到合适位置
if (start < i)
qusort(s, start, j - 1); //对分割出的部分再进行快排
if (i < end)
qusort(s, j + 1, end);
return 0;
}
- 完整代码
#include <stdio.h>
int qusort(int s[], int start, int end)
{
int i = start;
int j = end;
int tmp = s[start]; //tmp为基准
while (i < j)
{
while (i < j && tmp < s[j]) //比基准大
{
j--; //左移
}
if (i < j) //比基准小,放左边
{
s[i] = s[j];
i++; //右移
}
while (i < j && tmp >= s[i]) //比基准小
{
i++;
}
if (i < j) //比基准大,放右边
{
s[j] = s[i];
j--; //左移
}
}
s[i] = tmp; //将基准插入到合适位置
if (start < i)
qusort(s, start, j - 1); //对分割出的部分再进行快排
if (i < end)
qusort(s, j + 1, end);
return 0;
}
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0;i < 10;i++)
{
scanf("%d", &arr[i]);
}
qusort(arr, 0, 9);
printf("快排之后:\n");
for (i = 0;i < 10;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.时间复杂度和空间复杂度
- 时间复杂度
- 最好的情况
O(nlogn)- 最坏的情况
O(n^2)
- 空间复杂度
- 最好的情况
O(logn)- 最坏的情况
O(n)