排序
今天学习了sort快速排序
sort快速排序采用了分治的思想,通过函数递归处理。
在c语言如果想用快排,必须自己编写。
编写sort排序,做了三题
洛谷
P1177 【模板】快速排序
#include<stdio.h>
int f[2000002];
void sort(int *a, int left, int right);
int main(){
int n,l,*F=f;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
sort(F,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",f[i]);
}
void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j)
{
while(i < j && key <= a[j])
{
j--;
}
a[i] = a[j];
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
P1923 【深基9.例4】求第 k 小的数
#include<stdio.h>
int f[5000002];
void sort(int *a, int left, int right);
int main(){
int k,n,l,*F=f;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
sort(F,0,n-1);
printf("%d",f[k]);
}
void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j)
{
while(i < j && key <= a[j])
{
j--;
}
a[i] = a[j];
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
P1093 [NOIP2007 普及组] 奖学金
#include<stdio.h>
int f[305][5],e[305],g[305],h[305];
void sort(int *a, int *b, int *c, int left, int right);
int main(){
int n,l,*E=e,*G=g,*H=h;
scanf("%d",&n);
l=n;
getchar();
for(int i=1;i<=n;i++){
g[i]=i;
scanf("%d%d%d",&f[i][1],&f[i][2],&f[i][3]);
e[i]=f[i][1]+f[i][2]+f[i][3];
h[i]=f[i][1];
getchar();
}
sort(E,G,H,1,n);
for(int i=1;i<=l;i++){
for(int j=i;j<=l;j++){
if(e[i]==e[j]){
if(h[i]>h[j]){
int t;
t=e[i];e[i]=e[j];e[j]=t;
t=g[i];g[i]=g[j];g[j]=t;
t=h[i];h[i]=h[j];h[j]=t;
}
else if(h[i]==h[j]){
if(g[i]<g[j]){
int t;
t=e[i];e[i]=e[j];e[j]=t;
t=g[i];g[i]=g[j];g[j]=t;
t=h[i];h[i]=h[j];h[j]=t;
}
}
}
}
}
for(int i=n;i>n-5;i--){
if(i!=n-4)
printf("%d %d\n",g[i],e[i]);
else printf("%d %d",g[i],e[i]);
}
}
void sort(int *a, int *b, int *c, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left],key1 = b[left],key2 = c[left];
while(i < j)
{
while(i < j && key <= a[j])
{
j--;
}
a[i] = a[j];
b[i] = b[j];
c[i] = c[j];
while(i < j && key >= a[i])
{
i++;
}
a[j] = a[i];
b[j] = b[i];
c[j] = c[i];
}
a[i] = key;
b[i] = key1;
c[i] = key2;
sort(a, b, c, left, i - 1);
sort(a, b, c, i + 1, right);
}
都是比较基础的快排应用题。
快排函数的编写通常需要联系到一维数组或多维数组的传递,
一维数组的传递比较简单,多维数组则对指针运用的难度增加。
在需要多个数组时,
比较好的解决方法是构造结构体,可以使代码更简洁。