快速排序简单思路及程序
输入n个数,将其进行又小到大的排序
首先输入n个数,并将其保存到数组a[n]中。
例如我有以下一组数:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
34 | 57 | 78 | 9 | 54 |
首先我们要理解什么是快速排序?
它是由冒泡排序演变而来,人们在进行大规模排序运算时便发现使用冒泡法排序所消耗的时间太长,运算次数达到了O(n^2)。于是就有了快速排序的诞生,其运算级也缩减到O(n log n)。
冒泡排序是从左到右与相邻的数比较互换,多次遍历取得结果,而快速排序则是先找到一个基点,利用程序,将数组中小于它的值都排到它的左边,大于它的数都排到它的右边,利用递归思想,以它为分界点将其分为两个数组,重复操作,直至其左右两边都只有一个数值时,停止,这是从左到右的快速排序就完成了。
先定义一个变量t,用来存放基点值。再定义两个变量用来遍历:
34 | 57 | 78 | 9 | 54 |
---|---|---|---|---|
i-> | <-j |
从j开始依次遍历下去,直至其所对应的值小于基点值,并将a[i]=a[j],如图所示:
9 | 57 | 78 | 9 | 54 |
---|---|---|---|---|
i-> | j |
又从i开始遍历,直至找到其所对应的值大于基点值,又将a[j]=a[i],
如图所示:
9 | 57 | 78 | 57 | 54 |
---|---|---|---|---|
i | <-j |
用循环重复此操作,直至i=j时停止。
9 | 57 | 78 | 57 | 54 |
---|---|---|---|---|
i、j |
此时可以确保其i左边的值均小于基点值,其j右边的值均大于基点值,因此此时i与j所在的位置便是基点值在这组数组中所占据的位置,再将a[i]=t。
在以该基点值为界,对其左右两边的值分别进行此操作,直至其基点值两边只剩下一个数值。(用递归实现)
代码如下:
#include<iostream>
using namespace std;
void quicksort(int *a,int b,int c)
{
int n = a[b], i = b, j = c;
if (b >= c)
return;
while (i < j)
{
while (a[j] > n && j > i)
j--;
a[i] = a[j];
while (a[i]<n && j>i)
i++;
a[j] = a[i];
}
a[i] = n;
quicksort(a, b, i - 1), quicksort(a, j + 1, c);
}
int main()
{
int a[100] = { 0 }, n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
quicksort(a, 0, n - 1);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}