已知从键盘输入10个数,请将它们从小到大排序。
1.交换排序
我的理解:从第一个元素开始,依次与后面所有的元素进行比较,若比第一个元素小,则交换位置。一直循环下去,直到找到最小的元素为止,这样就可以确定第一个元素;同样的道理确定第二、第三、....个位置。
源代码
#include<stdio.h>
int main(){
int n;
printf("输入总个数:");
scanf("%d",&n);
int s[n];
printf("请输入数据:");
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
for(int j=0;j<n-1;j++){//比较次数为总数减1
for(int k=j+1;k<n;k++){//比较起点为起点元素的后一个元素
if(s[j]>s[k]){
int temp;
temp=s[j];
s[j]=s[k];
s[k]=temp;
}
}
}
printf("这些数从小到大的排序为:");
for(int l=0;l<n;l++){
printf("%d ",s[l]);
}
return 0;
}
运行结果:
2.选择排序
我的理解:从第一个元素开始,依次与后面所有的元素进行比较,若比第一个元素小,则标记该为位置,继续比较标记,直到找到最小位置后,才进行交换,若第一个位置本身就是最小的数,则不必进行交换。同样的,确定第二、第三、第...个的位置也是如此。
源代码
#include<stdio.h>
int main(){
int n,t;
printf("输入总个数:");
scanf("%d",&n);
int s[n];
printf("请输入数据:");
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
for(int j=0;j<n-1;j++){//比较次数为总数减1
t=j;
for(int k=j+1;k<n;k++){//比较起点为起点元素的后一个元素
if(s[t]>s[k])
t=k;
}
if(t!=j){//在这里注意交换 是指定位置与标记位置的交换
int temp;
temp=s[t];
s[t]=s[j];
s[j]=temp;
}
}
printf("这些数从小到大的排序为:");
for(int l=0;l<n;l++){
printf("%d ",s[l]);
}
return 0;
}
运行结果:
3.冒泡排序
我的理解:把n个数进行n-1轮排序,小的数上浮,大的数下沉。
源代码
#include<stdio.h>
int main(){
int n,t;
printf("输入总个数:");
scanf("%d",&n);
int s[n];
printf("请输入数据:");
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
for(int j=0;j<n-1;j++){//比较次数为总数减1
for(int k=0;k<n-1-j;k++){//注意1)起始位置为0;2)每次循环次数依次递减,公差为1
if(s[k]>s[k+1]){//注意3)是相邻元素的交换
int temp;
temp=s[k+1];
s[k+1]=s[k];
s[k]=temp;
}
}
}
printf("这些数从小到大的排序为:");
for(int l=0;l<n;l++){
printf("%d ",s[l]);
}
return 0;
}
运行结果:
4.归并排序
只可意会,不可言传...
源代码
#include<stdio.h>
void gui_bing(int a[],int l,int r,int n){
if(l>=r) return;
int mid=l+r>>1;
gui_bing(a,l,mid,n),gui_bing(a,mid+1,r,n);//不断对半分组,直至单个元素成组
int i=l,j=mid+1,k=0,tem[n];//tem[n] 数组用来存储临时的数组值
while(i<=mid&&j<=r)//&&:and 关系运算符取小于等于 两组两组的合并 小的排前面
if(a[i]<a[j]) tem[k++]=a[i++];
else
tem[k++]=a[j++];
while(i<=mid) tem[k++]=a[i++];//取小于等于 mid左边按小到大排序
while(j<=r) tem[k++]=a[j++];//取小于等于 mid右边按小到大排序
for(int i=l,j=0;i<=r;i++,j++) a[i]=tem[j];//最终赋值
}
int main(){
int n;
printf("输入总个数:");
scanf("%d",&n);
int a[n];
printf("请输入数据:");
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
gui_bing(a,0,n-1,n);
printf("这些数从小到大的排序为:");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
运行结果:
5.快速排序
只可意会,不可言传...
源代码
#include<stdio.h>
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void quick_sort(int a[],int l,int r){//函数要指明类型
if(l>=r) return;//递归终止条件不能漏
int i=l-1,j=r+1,x=a[l+r>>1];
while(i<j){
do i++;while(a[i]<x);
do j--;while(a[j]>x);
if(i<j) swap(&a[i],&a[j]);
}
quick_sort(a,l,j),quick_sort(a,j+1,r);
}
int main(){
int n;
printf("输入总个数:");
scanf("%d",&n);
int a[n];
printf("请输入数据:");
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
quick_sort(a,0,n-1);
printf("这些数从小到大的排序为:");
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
运行结果:
ps:第一次写博客,非常仓促,有许多不足的地方请多指教(...轻点喷...)