对一组int型数组进行快速排序。
int a[] = {6,4,7,1,9,8,5,2,3}
思路:
- 把数组的第一个数6设置为基准点
- 从第二个数开始,逐个与基准数 6 进行比较,把比它小的数都放到前面,比它大的数都放到后面。
- 函数嵌套。把基准数两边的数看做两个新的无序数组(看做两个数组,实际数组并未拆开),同样进行比较,这样一直嵌套最终数组排序完成。
- 嵌套停止的条件是函数的第二、三个参数相等,即“拆分”的数组仅有一个数。
代码:
#include<stdio.h>
#include<math.h>
//打印函数
void display(int array[],int maxlen)
{
int i;
for(i=0 ; i<maxlen ; i++)
{
printf("%d ",array[i]);
}
printf("\n");
return;
}
//交换函数
void swap(int *a,int *b)
{
int temp;
temp= *a;
*a= *b;
*b= temp;
return;
}
//快速排序算法
void QSort(int *array, int begin, int end)
{
int i,j;
display(array,end+1);
if(begin < end)
{
i= begin+1; //将array[begin]作为基准数
j= end; //array[end]是数组最后一位
while(i < j)
{
if(array[i] > array[begin])
{
swap(&array[i],&array[j]); //如果该元素大于基准数,则交换位置
j--;
}
else
{
i++; //继续比较
}
}
//跳出后i=j
if(array[i] >= array[begin]) //特殊情况
{
i--;
}
swap(&array[begin],&array[i]); //将基准数换至分界点
QSort(array,begin,i); //继续排序,以此类推,直到begin == i,j == end
QSort(array,j,end); //或者说直到第二第三两个参数相等
}
}
//主函数
main()
{
int array[] = {6,4,7,1,9,8,5,2,3};
int n = sizeof(array) / sizeof(int);
QSort(array, 0, n-1);
display(array,n);
}
快速排序的第二种实现方法:
#include <stdio.h>
/*
函数功能:快速排序
array:要排序的数组
beg:数组头
end:数组尾
*/
int quick_sort(char *array, int beg, int end)
{
int flag = 0; //前面位置为空
int x = beg;
int y = end;
if(beg > end)
{
return -1; //嵌套循环退出条件
}
int base = array[beg]; //选取基准值
while(x < y)
{
if(flag == 0)
{
/* 从序列后面遍历, 比基准值小的数放到前面 */
if(array[y] >= base)
{
y--;
continue;
}
array[x] = array[y];
x++;
flag = 1;
}
else
{
/* 从序列前面遍历, 比基准值大的数放到后面 */
if(array[x] <= base)
{
x++;
continue;
}
array[y] = array[x];
y--;
flag = 0;
}
}
array[x] = base; //把基准值放到x的位置上
quick_sort(array, beg, x-1);
quick_sort(array, x+1, end);
return 0;
}
int main()
{
char str[1000] = {0};
scanf("%s", str);
int len = strlen(str);
quick_sort(str, 0, len-1);
printf("%s\n", str);
return 0;
}
2355

被折叠的 条评论
为什么被折叠?



