快速排序代码 + 详细解析
程序员文章站
2024-03-25 14:39:28
...
算法思想:
- 以一个元素为基准,将序列进行一次划分,使得左边都比它小,右边都比它大。
- 然后对左右序列不断进行划分,直至每一个序列都只有一个元素为止。
/*
算法思想:
-以一个元素为基准,将序列进行一次划分,使得左边都比它小,右边都比它大。
-然后对左右序列不断进行划分,直至每一个序列都只有一个元素为止。
测试数据:
0 9 1 8 2 7 3 6 4 5
*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void quickSort(int arr[],int low,int high)
{
int temp;
int i = low;
int j = high;
if(low < high)
{
temp = arr[low];
//该层循环就是一次划分的主体
while(i < j)
{
//从右边开始扫描,找到一个比它小的
while(j > i && arr[j] >= temp) --j;
//将小的移到左边
if(i < j)
{
arr[i] = arr[j];
++i;
}
//从左边开始扫描,找到一个比它大的
while(i < j && arr[i] <= temp) ++i;
//将大的移到右边
if(i < j)
{
arr[j] = arr[i];
--j;
}
}
//此时左右指针相遇,i=j,完成一次划分,左边都比temp小, 右边都比temp大
printf("\n左右指针相遇,完成一次划分\n");printf("%d\n",temp);
arr[i] = temp;//将temp置于指针相遇处
for(int k = 0;k < 10;++k)
{
printf("%d ",arr[k]);
}
printf("\n-----------------------\n");
quickSort(arr,low,i-1);//左序列递归
quickSort(arr,i+1,high);//右序列递归
}
}
int main()
{
int arr[10];
for(int i = 0;i < 10;++i)
{
scanf("%d",&arr[i]);
}
quickSort(arr,0,9);
for(int i = 0;i < 10;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
上一篇: C++范围for语句