您的位置:首页 > 理论基础 > 数据结构算法

数据结构之——快速排序

2016-10-28 22:29 211 查看

#include <stdio.h>
#include <stdlib.h>

#define true 1
#define false 0
typedef int bool;

//输入一个数组,进行快速排序后输出
//快排子函数,输入参数为数组名和数组最小的下标和最大的下标

//快速排序的实现依赖于递归,该首先确定了某个元素在序列中的位置后,将原序列分为左右两个部分,然后按照先左,再右的顺序进行递归
void quick_sort(int * a, int low ,int high)
{
int pos = low;
if(low < high)
{
pos = locate(a,low,high);
quick_sort(a,low,pos-1);
quick_sort(a,pos+1,high);
}
}

//将 low 位置上的元素在数组中确定其定位,并返回位置序号 pos ;快排程序理解的难点一是递归,二是这个子函数
int locate(int* a,int low ,int high)
{
int val = a[low];   //定位此次递归中,最左侧元素 a[low] 的位置,并返回位置序号 pos
while(low < high)
{
while(low < high && a[high] > val)   //最右侧元素比 val 的值大时,high-- ,直到 a[high]不再大于 val 也就是说,此时的a[high]必须要换到a[low]了
high--;                         //再出现在这儿不合适了
a[low] = a[high];
while(low < high && a[low] < val)     //最左侧的元素比 val 的值小时, low++ ,直到 a[low]不再小于 val ,也就是说,此时的a[low]应该出现在val 的右侧
low++;
a[high] = a[low];
}
a[low] = val;        //当以上 while 循环结束后,必然有 low == high 此时的位置,即为 val 这个元素应该在的位置,并返回此位置
return low;          //此位置返回后,又会将原序列分为左右两部分,然后按照先左边,再右边的顺序递归,并且每次递归了,都是确定其每个子序列最左侧元素的位置
}
int main()
{
int num,i;
char c;
printf("请输入数组元素的个数 = \n");
scanf("%d",&num);
int a[num];
printf("请输入数组元素,每个元素以逗号隔开\n");

for(i=0;i<num;i++)
{
if(scanf("%c",&c)==',')
break;
scanf("%d",&a[i]);
}

quick_sort(a,0,num-1);

for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: