#include
//找到最大的元素和次大的元素
void find(int a[],int b[])
{
int max1=a[0];
int max2=-1000,t;
for(int i=0;i<6;i++)
{
if(a[i]>max2)
if(a[i]>max1)
max2=a[i];
else
{
max2=max1;
max1=a[i];
}
}
b[0]=max1;
b[1]=max2;
}
int main()
{
int b[2]={0,0};
int a[]={2,5,1,4,6,3};
find(a,b);
printf("最大值为%d",b[0]);
printf("\n");
printf("次大值为%d",b[1]);
}
#include
//找到最大的元素和次大的元素
void find(int a[],int b[])
{
int max=a[0];
int max1=0;
for(int i=0;i<6;i++)
{
if(a[i]>max)
max=a[i];
}
for(int i=0;i<6;i++)
{
if(a[i]<max&&a[i]>max1)
max1=a[i];
}
b[0]=max;
b[1]=max1;
}
int main()
{
int b[2]={0,0};
int a[]={2,5,1,4,6,3};
find(a,b);
printf("最大值为%d",b[0]);
printf("\n");
printf("次大值为%d",b[1]);
}
#include
void sort(int a[],int n)
{
int p;
int k=0;
int b[n],c[n];
for(int i=0;i<n;i++)
{
b[i]=a[i];
c[i]=a[i];
}
printf("\n");
while(k<n)
{
for(int i=0;i<n;i++)
{
b[i]=b[i]-1;
if(b[i]==0)
a[k++]=c[i];
}
}
}
int main()
{
int a[]={2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前,数组为");
for(int i=0;i<6;i++)
printf("%d",a[i]);
sort(a,n);
printf("排序后,数组为");
for(int i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
printf("最大值为%d",a[n-1]);
printf("\n");
printf("次大值为%d",a[n-2]);
return 0;
}
#include
void sort(int a[],int n)
{
int t;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[j]>a[i])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
}
int main()
{
int a[]={2,5,1,4,6,3};
sort(a,6);
printf("最大值为%d",a[0]);
printf("\n");
printf("次大值为%d",a[1]);
}
#include
void sort(int a[],int n)
{
int t;
for(int i=0;i<n;i++)
for(int j=0;j<n-i-1;j++)
if(a[j+1]>a[j])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
int main()
{
int a[]={2,5,1,4,6,3};
sort(a,6);
printf("数组为");
for(int i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
printf("最大值为%d",a[0]);
printf("\n");
printf("次大值为%d",a[1]);
}
#include
void sort(int a[],int n)
{
int i,j;
for(i=2;i<n;i++)
{
a[0]=a[i];
j=i-1;
while(a[0]>a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=a[0];
}
}
int main()
{
int a[]={-100,2,5,1,4,6,3};
printf("排序前数组为");
for(int i=1;i<=6;i++)
printf("%d",a[i]);
printf("\n");
sort(a,7);
printf("排序后数组为");
for(int i=1;i<=6;i++)
printf("%d",a[i]);
printf("\n");
printf("最大值为%d",a[1]);
printf("\n");
printf("次大值为%d",a[2]);
}
#include
void sort(int r[],int length)
{
int x;
int mid;
for(int i=2;i<=length;i++)//从第2个值开始,不断插入
{
x=r[i];//将插入值存放在x中
int low=1;
int high=i-1;//high表示上一次数组的最后一个位置的值
while(low<=high)
{
mid=(low+high)/2;
if(x<r[mid]) //比较与中间值的大小关系
high=mid-1;
else
low=mid+1;
}
for(int j=i-1;j>=low;j--)//将所有的后面的值向前挪
r[j+1]=r[j];
r[low]=x;//在low处放入数之
}
}
int main()
{
int a[]={0,2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前数组为");
for(int i=1;i<7;i++)
printf("%d ",a[i]);
sort(a,n);
printf("\n");
printf("排序后数组为");
for(int i=1;i<7;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[n-1]);
printf("\n");
printf("次大值为%d",a[n-2]);
return 0;
}
//快速排序
#include
#include
int part(int a[],int s,int t)
{
int *b;
int i,j;
int k=s;
int mid=a[s];
i=s;
j=t;
b=(int*)malloc((t-s+1)*sizeof(int));
for(int k=s+1;k<=t;k++)
{
if(a[k]<mid)
b[j--]=a[k];
else
b[i++]=a[k];
}
b[i]=mid;
for(int v=s;v<=t;v++)
a[v]=b[v];
free(b);
return i;
}
void sort(int a[],int s,int t)
{
int i;
if(s<t)
{
i=part(a,s,t);
sort(a,s,i-1);
sort(a,i+1,t);
}
}
int main()
{
int a[]={-100,2,5,1,4,6,3};
printf("排序前数组为");
for(int i=1;i<=6;i++)
printf("%d ",a[i]);
printf("\n");
sort(a,1,6);
printf("排序后数组为");
for(int i=1;i<=6;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[1]);
printf("\n");
printf("次大值为%d",a[2]);
}
//归并排序
#include
#include
void merge(int a[],int low,int mid,int high)
{
int i=low;
int j=mid+1;
int k=0;
int *temp;
temp=(int *)malloc((high-low+1)*sizeof(int));
while(i<=mid&&j<=high)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=mid)
temp[k++]=a[i++];
while(j<=high)
temp[k++]=a[j++];
for(int i=low,k=0;i<=high;i++)
a[i]=temp[k++];
free(temp);
}
void sort(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
sort(a,low,mid);
sort(a,mid+1,high);
merge(a,low,mid,high);
}
}
int main()
{
int a[]={-100,2,5,1,4,6,3};
printf("排序前数组为");
for(int i=1;i<=6;i++)
printf("%d ",a[i]);
printf("\n");
sort(a,1,6);
printf("排序后数组为");
for(int i=1;i<=6;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[6]);
printf("\n");
printf("次大值为%d",a[5]);
}
#include
void sort(int a[],int n)
{
int i,j,gap,temp,k;
printf("%d",n);
for(gap=n/2;gap>=1;gap/=2)
{
for(i=0;i<gap;i++)
{
for(j=i+gap;j<n;j+=gap)
{
if(a[j-gap]>a[j])
{
temp=a[j];
for(k=j-gap;k>=0&&a[k]>temp;k-=gap)
a[k+gap]=a[k];
a[k+gap]=temp;
}
}
}
}
}
int main()
{
int a[]={2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
sort(a,n);
printf("数组为");
for(int i=0;i<6;i++)
printf("%d",a[i]);
printf("\n");
printf("最大值为%d",a[n-1]);
printf("\n");
printf("次大值为%d",a[n-2]);
return 0;
}
#include
void head_adjust(int* arr,int s,int m) // 一个交换的过程
{
int temp=arr[s]; //将要交换的值存起来
for(int j=2*s+1;j<=m;j=2*j+1) //挑出当前层的最大值
{
if(j<m&&arr[j]<arr[j+1])//选择两个中较大的
++j; //左边小的话选右边
if(temp>=arr[j])//如果有一个值超过了arr[j],两者进行一次交换
break;
arr[s]=arr[j];//交换1
s=j; //记录j的小标
}
arr[s]=temp; //交换2
}
void swap(int a,int b) //将两个数字进行交换
{
int t;
t=a;
a=b;
b=t;
}
void sort(int *arr,int len)
{
for(int i=(len-1)/2;i>=0;i--)//建立一个大顶堆 //保证n-1层满足即可
{
head_adjust(arr,i,len-1); //
}
for(int i=len-1;i>0;i--)//进行堆排序
{
swap(arr[0],arr[i]);//每次与将其中的一个值与a[0]交换,破坏顶堆
head_adjust(arr,0,i-1);//堆顶元素和堆底元素交换,使用的大顶堆
}
}
int main()
{
int a[]={2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
sort(a,n);
printf("\n");
printf("排序后数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[0]);
printf("\n");
printf("次大值为%d",a[1]);
return 0;
}
//快速排序
#include
#define N 100
void sort(int a[],int n)
{
int k=0;
int bucket[N];
for(int i=0;i<N;i++)
bucket[i]=0;
for(int i=0;i<n;i++)
bucket[a[i]]=1;
for(int i=0;i<N;i++)
for(int j=0;j<bucket[i];j++)
a[k++]=i;
}
int main()
{
int a[]={2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
sort(a,n);
printf("排序后数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[n-1]);
printf("\n");
printf("次大值为%d",a[n-2]);
}
#include
void sort(int a[],int n)
{
int max=a[0],min=a[0];
for(int i=0;i<n;i++) //挑选最大,最小值
{
if(a[i]>max)
{
max=a[i];
}
if(a[i]<min)
{
min=a[i];
}
}
int k=max-min+1;
int c[k]={0}; //创建计数数组
for(int i=0;i<n;i++) //计数
{
c[a[i]-min]+=1;
}
int j=0;
for(int i=0;i<k;i++)
{
while(c[i]>0)
{
a[j]=i+min;
j++;
c[i]--;
}
}
}
int main()
{
int a[]={2,5,1,4,6,3};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
sort(a,n);
printf("排序后数组为");
for(int i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[n-1]);
printf("\n");
printf("次大值为%d",a[n-2]);
}
#include
#include
void RadixCountSort(int *index,int *a,int len)
{
int i;
int *count=(int *)malloc(sizeof(int)*10);
for(i=0;i<10;i++) //计数数组为0
count[i]=0;
for(i=0;i<len;i++) //记录索引对应标记
count[index[i]]++;
for(i=1;i<10;i++) //将数字累加
count[i]=count[i]+count[i-1];
int *sort=(int *)malloc(sizeof(int)*len); //创建一个临时数组空间
for(i=len-1;i>=0;i--) //倒序输出
{
count[index[i]]--; //对应位置-1
sort[count[index[i]]]=a[i]; //放入对应的数组
}
//index[i]值-----sort----count[]下标
for(i=0;i<len;i++)
a[i]=sort[i];
free(sort);
free(count);
}
void RadixSort(int *a,int len)
{
int i,x=1;
int tmp=1;
int *radix=(int *)malloc(sizeof(int)*len);//创建一个单个位数的数组 (同为个位,十位,或百位)
while(x) //当x不等于0时
{
tmp=tmp*10;
x=0;
for(i=0;i<len;i++)
{ //举例当a[i]=123
radix[i]=a[i]%tmp; // 3 23 123 123
radix[i]=radix[i]/(tmp/10); // 3 2 1 0
if(a[i]/tmp>0)//如果对应还存在不为0的商,继续循环
{
x=1;
}
}
RadixCountSort(radix,a,len);//是数组a发生变化,本轮的a将会排好
//同位数的比较,当a排好之后,位数相同的就排好了
// 不位数的比较,位数不同的以0做区分
}
free(radix);
}
int main()
{
int i,len;
int a[]={2,5,1,4,6,3};
len=sizeof(a)/sizeof(int);
printf("排序前,数组为");
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
RadixSort(a,len);
printf("排序后,数组为");
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大值为%d",a[len-1]);
printf("\n");
printf("次大值为%d",a[len-2]);
return 0;
}