快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。
快速排序过程图:
快速排序和归并排序有一些相同点和一些不同点,比如两种都使用了分治的思想,都是递归+排序,不同点在于归并排序是先递归后排序,而快速排序是先排序,后递归。
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; [1] 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; [1] 3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换; [1] 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换; [1] 5)重复第3、4步,直到 i 等于 j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外, i 等于 j 这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
void func(int * a, int s, int e)
{
//快速排序使用的是分治法,我们可以使用递归来重复操作
if (s == e)return;
//排序
int i = s;
int j = e;
int data = a[s];
int arrint = s;
while (j != i)
{
//从右往左遍历
for (int f = j; f >=s; f--)
{
if (j == i) break;
if (data <= a[f])
{
int temp = a[f];
a[f] = a[arrint];
a[arrint] = temp;
arrint = f;
j = f - 1;
break;
}
j = f - 1;
}
//从左往右遍历
for (int f = i; f <= e; f++)
{
if (j == i) break;
if (data >= a[f])
{
int temp = a[f];
a[f] = a[arrint];
a[arrint] = temp;
arrint = f;
i = f+1;
break;
}
i = f + 1;
}
}
int min = s + (e - s) / 2;
func(a, s, min);
func(a, min + 1, e);
}
int main()
{
//归并的参数值 和快速参数值的不同作用
int a[] = { 8,7,10,12,4,5,6,9 };
func(a, 0, 7);
for (int i = 0; i <8; i++)
{
cout << a[i] << " ";
}
return 0;
}