C语言问题求大神详解啊
发布网友
发布时间:2023-10-19 05:20
我来回答
共2个回答
热心网友
时间:2024-11-28 22:50
这个函数实现了快速排序
快速排序采用递归的方法,
每次将某个数放到合适的位置后再递归处理这个数左右的子序列,
所有的数都被放到合适的位置后排序结束。
下面来分析你给的这个函数,注意子序列在原序列中的相对位置
//a为待排序原序列
//left为原序列中的左指针,指向子序列中第1个数在原序列中的位置
//right为原序列中的右指针,指向子序列中最后1个数在原序列中的位置
void myqsort(int a[], int left, int right)
{
int i,last;
//算出子序列中处于中间位置的数在原序列中的位置
int m=(left+right)/2;
//递归终止条件,左指针达到或超过了右指针
if (left >= right) return;
//先把子序列中处于中间位置的数和子序列最左边的数交换,作为这次待放入合适位置的数(待排序数)
swap(a,m,left);
//由于子序列中左数第1个数是待排序数,那么从左数第2个数开始扫描整个子序列
//把扫描到的小于待排序数的那些数依次和子序列中第2、第3…个位置的数进行交换
//last记录最后一个移动到前面的数所在的原序列中的新位置,它也表示了比待排序数要小的数字个数
for (i=left+1,last=left; i<=right; i++)
if (a[i]<=a[left])
swap(a,i,++last);
//由于最后一个移动到前面的数一定比待排序数要小,交换它们
swap(a,left,last);
//这个时候对于这个子序列来说
//比待排序数小的数都到了待排序数的左边
//比待排序数大的数都到了待排序数的右边
//递归排序待排序数左边的子序列
myqsort(a,left,last-1);
//递归排序待排序数右边的子序列
myqsort(a,last+1,right);
}
由于一开始指定的left和right一定是0和(a序列的长度-1),这样一来每轮排序都一定能保证有一个数被移动到整个序列中最合适的位置,通过递归反复对每个子序列进行排序后就能得到一个排序好的a序列了。
追问谢谢啦
热心网友
时间:2024-11-28 22:51
这只是一部分啊,发完整的追问#include
#define N 100
void printarray(int a[],int n)
{
int i;
for (i=0; i<n;)
{
printf("%8d",a[i++]);
if (i % 10 == 0) printf("\n");
}
}
void swap(int a[],int i,int j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}