数组排序c语言,c语言码龄1年
大家好,关于数组排序c语言很多朋友都还不太明白,今天小编就来为大家分享关于c语言码龄1年的知识,希望对各位有所帮助!
求C语言将数组元素大小排序!!
C语言将数组元素大小排序方法:
以下使用的是冒泡排序法实线数组从小到大排序。
思想:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
10、2、3、4、5、6、9、8、7、1是输入的待排序的数列,经过第一次排序,将最大的,10放在最后,第二次排序,将剩下的2、3、4、5、6、9、8、7、1进行冒泡,将当前最大的9放在倒数第二的位置,以此类推。
以下是具体代码:
#include<stdio.h>
int main(){
int nums[10]={10, 2, 3, 4, 5, 6, 9, 8, 7, 1};
int i, j, temp, isSorted;
//优化算法:最多进行 n-1轮比较
for(i=0; i<10-1; i++){
isSorted= 1;//假设剩下的元素已经排序好了
for(j=0; j<10-1-i; j++){
if(nums[j]> nums[j+1]){
temp= nums[j];
nums[j]= nums[j+1];
nums[j+1]= temp;
isSorted= 0;//一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted) break;//如果没有发生交换,说明剩下的元素已经排序好了
}
for(i=0; i<10; i++){
printf("%d", nums[i]);
}
printf("
");
return 0;
}
扩展资料:
其他将数组从小到大排序的算法
以下使用的是选择排序法实现数组从小到大排序。
思想:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置
输入的序列为10、2、3、4、5、6、9、8、7、1进行一次排序后将最小的数放在了第一位(a[0]与它后面的所有数进行比较,若a[0]比后面的数大,进行交换),以此类推。
以下是具体代码:
#include<stdio.h>
int main(void){
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf("
");
}
return 0;
}
C语言编写函数,数组排序
void Swap(int*a, int*b)
{
int tmp=*a;
*a=*b;
*b= tmp;
}
void Selectsort(int*arr, int sz)
{for(int end=sz-1; end>=0; end--)
{
int max= end;
int i;
for( i= 0; i<= end; i++)//选出最大下标
{
if(arr[i]> arr[max])
{
max= i;
}
}
Swap(&arr[end],&arr[max]);
}
}
int main()
{
int arr[5]={ 1, 3, 2, 5, 4};
int sz= sizeof(arr)/ sizeof(arr[0]);
for(int i= 0; i<= sz- 1; i++)
{
scanf("%d",&arr[i]);
}
Selectsort(arr, sz);
for(int i= 0; i<= sz- 1; i++)
{
printf("%d", arr[i]);
}
system("pause");
return 0;
}
扩展资料:printf函数使用注意事项
1、域宽
%d:按整型数据的实际长度输出。
如果想输出指定宽度可以指定域宽,%md-->m域宽,打印出来以后,在控制台上,显示m位;
如果要打印的数的位数如果超过我们设定m则原样输出;
如果要打印的数的位数如果小于设定的位数,则补空白,具体如下:
如果m为正数,则左对齐(左侧补空白);
如果m为负数,则右对齐(右侧补空白)。
2、转义字符
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。
如:printf("%f%%",1.0/3);输出结果:0.333333%。
C语言数组A用选择排序
定义一个整型数组a[n],下面用五种方法对其从小到大排序。
(1)“冒泡法”
冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i ],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:
void bubble(int*a,int n)/*定义两个参数:数组首地址与数组大小*/
{
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)/*注意循环的上下限*/
if(a[i ]>a[j]){
temp=a[i ];
a[i ]=a[j];
a[j]=temp;
}
}
冒泡法原理简单,但其缺点是交换次数多,效率低。
下面介绍一种源自冒泡法但更有效率的方法“选择法”。
(2)“选择法”
选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i ],这样就比冒泡法省下许多无用的交换,提高了效率。
void choise(int*a,int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++){
k=i;/*给记号赋值*/
for(j=i+1;j<n;j++)
if(a[k]>a[j ]) k=j;/*是k总是指向最小元素*/
if(i!=k){/*当k!=i是才交换,否则a[i ]即为最小*/
temp=a[i ];
a[i ]=a[k];
a[k]=temp;
}
}
}
选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。
(3)“快速法”
快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j).它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:
void quick(int*a,int i,int j)
{
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i+j)/2];/*选取的参照*/
do{
while(a[m]<k&&m<j) m++;/*从左到右找比k大的元素*/
while(a[n]>k&&n>i) n--;/*从右到左找比k小的元素*/
if(m<=n){/*若找到且满足条件,则交换*/
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}while(m<=n);
if(m<j) quick(a,m,j);/*运用递归*/
if(n>i) quick(a,i,n);
}
(4)“插入法”
插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。
void insert(int*a,int n)
{
int i,j,temp;
for(i=1;i<n;i++){
temp=a[i ];/*temp为要插入的元素*/
j=i-1;
while(j>=0&&temp<a[j]){/*从a[i-1]开始找比a[i ]小的数,同时把数组元素向后移*/
a[j+1]=a[j ];
j--;
}
a[j+1]=temp;/*插入*/
}
}
(5)“shell法”
shell法是一个叫 shell的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:
void shell(int*a,int n)
{
int i,j,k,x;
k=n/2;/*间距值*/
while(k>=1){
for(i=k;i<n;i++){
x=a[i ];
j=i-k;
while(j>=0&&x<a[j]){
a[j+k]=a[j ];
j-=k;
}
a[j+k]=x;
}
k/=2;/*缩小间距值*/
}
}
上面我们已经对几种排序法作了介绍,现在让我们写个主函数检验一下。
#include<stdio.h>
/*别偷懒,下面的"..."代表函数体,自己加上去哦!*/
void bubble(int*a,int n)
{
...
}
void choise(int*a,int n)
{
...
}
void quick(int*a,int i,int j)
{
...
}
void insert(int*a,int n)
{
...
}
void shell(int*a,int n)
{
...
}
/*为了打印方便,我们写一个print吧。*/
void print(int*a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%5d",a[i ]);
printf("\n");
}
main()
{/*为了公平,我们给每个函数定义一个相同数组*/
int a1[]={13,0,5,8,1,7,21,50,9,2};
int a2[]={13,0,5,8,1,7,21,50,9,2};
int a3[]={13,0,5,8,1,7,21,50,9,2};
int a4[]={13,0,5,8,1,7,21,50,9,2};
int a5[]={13,0,5,8,1,7,21,50,9,2};
printf("the original list:");
print(a1,10);
printf("according to bubble:");
bubble(a1,10);
print(a1,10);
printf("according to choise:");
choise(a2,10);
print(a2,10);
printf("according to quick:");
quick(a3,0,9);
print(a3,10);
printf("according to insert:");
insert(a4,10);
print(a4,10);
printf("according to shell:");
shell(a5,10);
print(a5,10);
}
OK,关于数组排序c语言和c语言码龄1年的内容到此结束了,希望对大家有所帮助。