快速排序算法
算法思想:从待排序的数据中选取一个标志数据,把数组中比标志数据flag小的数据放在其左边,比标志数据大的放在右边。这样,只需要考虑数据转移的代码设计,当把这个标志数据的待排位置确定了,就把问题分为了两个子问题,是两个子问题的问题规模不相同,但是解决办法相同。同时,C语言实现的话,存在大量在数组之间的数值交换,不需要用到其他新的数组,并且在子问题中直接可以对原数据数组a[]进行交换数据,不需要有合并的操作。
递归边界代码:
if(i==j)
return 0;
if(i==j-1)
{
if(a[j]>a[i])
return 0;
if(a[j]<a[i])
{
swap(i,j,a);
return 0;
}
}
数据转移代码:
if(m<n)
{
while(m!=n)
{
while(m<n&&a[n]>flag)
n--;
swap(n,m,a);
while(m<n&&a[m]<flag)
m++;
swap(m,n,a);
}
数据交换函数swap:
void swap(int a,int b,int c[])
{
int S;
S=c[a];
c[a]=c[b];
c[b]=S;
}
分治函数sort:
sort(i,m-1,a);
sort(m+1,j,a);
总代码:
#include<stdio.h>
#include<windows.h>
void swap(int a,int b,int c[])
{
int S;
S=c[a];
c[a]=c[b];
c[b]=S;
}
int sort(int i,int j,int a[])
{
int flag,m,n;
if(i==j)
return 0;
if(i==j-1)
{
if(a[j]>a[i])
return 0;
if(a[j]<a[i])
{
swap(i,j,a);
return 0;
}
}
m=i;
n=j;
flag=a[i];
if(m<n)
{
while(m!=n)
{
while(m<n&&a[n]>flag)
n--;
swap(n,m,a);
while(m<n&&a[m]<flag)
m++;
swap(m,n,a);
}
sort(i,m-1,a);
sort(m+1,j,a);
}
}
void main(){
int n,k,a[100];
printf("输入问题规模:");
scanf("%d",&n);
printf("输入问题具体数字:\n");
for(k=0;k<=n-1;k++)
scanf("%d",&a[k]);
sort(0,n-1,a);
for(k=0;k<=n-1;k++)
printf("%d ",a[k]);
system("pause");
}
本文详细介绍了快速排序算法的工作原理,包括如何选取标志数据、数据的转移过程以及递归分治策略。提供了C语言实现的详细代码,包括数据交换函数和排序函数,展示了如何在不使用额外数组的情况下完成排序。通过递归调用sort函数,实现了数组的快速排序。
3万+

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



