c语言 快速排序 算法及实现
我们现在对6 1 2 7 9 3 4 5 10 8 进行快速排序
选左边第一个数作为基准数字
基本思想是对于除了基准数字的其他九个数字,大于基准数字的放在基准数字的右边,小于基准数字的放在基准数字的左边
具体实现过程
1. 以6位基准数字,从又往左看,若大于基准数字,则比较下一个数字
例如8大于6,那么比较10 和 6, 10 大于 6 ,那么比较5 和 6, 5 小于6,此时停止右边的比较
2. 继续从左往右看, 若小于基准数字, 则比较下一个数字
例如1 小于 6,比较 2 和6 , 2 小于 6, 比较7 和6, 7 大于 6,此时停止左边的比较
3. 交换右边停止位置的数和左边停止位置的数,这里是交换5 和 7;
得到6 1 2 5 9 3 4 7 10 8
4. 继续比较7 左边的数据和基准数据的大小,直到满足1中的条件,停止。然后比较5 右边的数据和基准数据, 直到满足2的条件,停止。进行3的操作
5. 直到左边和右边相遇,将相遇处的数字和基准数字交换,第一轮排列结束
这里的结果是
3 1 2 5 4
69 7 10 8
然后再分别对于相遇点左右两边的数据重复1-5的操作,直到排列结束(结束条件见代码)
#include <iostream>
using namespace std;
//快排函数
void quicksort(int * a , int left, int right);
int main(void)
{
int n;
cin >>n;
int a[101] = {0};
for(int i=0; i<n; i++)
{//输入数据
cin >> a[i];
}
int left = 0;
int right = n-1;
//递归排序
quicksort(a, left, right);
for(int j=0; j<n; j++)
{//输出结果
cout << a[j] <<" ";
}
cout << endl;
return 0;
}
void quicksort(int * a , int left, int right)
{
int temp = a[left]; //基准数据//将左边第一个作为基准数据
int i = left;
int j = right;
if(left > right)//结束条件
return ;
while(i != j)
{//一直进行直到ij相遇
while(a[j] >= temp && i < j)
{//从最右边开始比较//必须的//如果大于基准数据,那么j--,否则,开始左边的比较
j--;
}
while(a[i] <= temp && i < j)
{//如果小于基准数据,i++, 否则交换a[i], a[j]
i++;
}
if(i < j)
{//交换
int t = 0;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//当i和j相遇时候,将基准数据和相遇点的数据交换
a[left] = a[i];
a[i] = temp;
//递归排列相遇点左边和右边的数据
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
样例数据
10
6 1 2 7 9 3 4 5 10 8
6 1 2 7 9 3 4 5 10 8
输出截图