当前位置:首页 » 编程软件 » 编译任意从小加到大的程序

编译任意从小加到大的程序

发布时间: 2022-05-22 12:31:33

Ⅰ 编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中

int main()

{

Link head; //链表(不带头节点)

int n;

printf("输入链表的长度n: ");

scanf("%d",&n);

printf("连续输入%d个数据(以空格隔开): ",n);

head=CreateLink(n);

printf(" 原本链表的节点是: ");

DispLink(head);

LinkSort(head);

printf(" 从大到小排序之后: ");

DispLink(head);

printf(" ");

return 0;

}

链表的具体存储表示为:

① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:网络-单链表

Ⅱ 用C++6.0编译代码:任意输入一组数,实现从小到大的排列。

(1)2分法查找
(2)插入排序(稳定)

(3)冒泡排序(稳定)

(4)基数排序

(5)归并排序

(6)直接选择排序(不稳定)

(7)快速排序(不稳定)

(8)希尔排序(不稳定)

(9)堆排序

=================================================

(1)2分法查找有序连续内存

template <class C>

int bsearch(C value,iterator begin,iterator end){

iterator mid=& begin[(end-begin)/2];

if(*mid==value)return begin-mid;

else{

if(begin==end)return -1;

if(value<*mid)return
bsearch(value,begin,mid);

else return
bsearch(value,++mid,end);

}

return -1;

}

int main(void){

int buf2[]={1,3,9,10};

int idx=bsearch<int,int*>(1,buf2,&buf2[3]);

if(idx!=-1)printf("v=%d,pos=%d\n",buf2[idx],idx);

else printf("not found\n");

return 0;

}

(2)插入排序(稳定)----当然,可以用折半插入排序来提高性能

template <class T>

void isort(T begin,size_t length){

size_t l=length*sizeof(*begin);

T s=(T)malloc(l);

s[0]=begin[0];

for(int b=1;b<length;++b){

size_t
c=0;

for(;c<b;++c){

if(begin[b]<s[c]){

for(size_t k=b-c;k>0;--k){

s[c+k]=s[c+k-1];

}

break;

}

}

s[c]=begin[b];

}

memcpy(begin,s,l);

delete[] s;

}

main(...)

short buf2[]={11,3,9,10,7,6,15,2};

isort(buf2,8);

for(int
i=0;i<sizeof(buf2)/sizeof(short);++i)printf("%d ",buf2[i]);

(3)冒泡排序(稳定)
template <class T>

void bubsort(T s,size_t len){

for(int i=0;i<len-1;++i){//loop count

int
op=0;

for(int m=0;m<len-i;++m){

if(s[m]>s[m+1]){

int tmp=s[m];

s[m]=s[m+1];

s[m+1]=tmp;

op=1;

}

}

if(!op)return;

}

}

(4)基数排序:O(nlog(r)m)其中r为所采取的基数,而logr(n)=m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。合理设计r和m的值,可以得到最有解。它利用了每次比较以后得到的历史信息。需要根据需求具体设计,没有通用形式,必须根据具体问题的信息具体设计,例如扑克牌排序等。它的核心思想是利用数据的某方面的特定信息。下面的例子是排序如果各2位正数,使用了10个桶
#include<cstdio>

#include<cstdlib>

#include<algorithm>

#include<iterator>

#include<iostream>

//Radix,Bucket sort

#define DEMICAL 10

int buk[DEMICAL][DEMICAL+1];//bucket

short t[DEMICAL];//top;

int *p;

void getb(size_t b){

printf("\nt[b]=%d,",t[b]);

if(t[b]==0){

printf("buk[%d] is empty",b);

return;

}else{

for(int i=1;i<=t[b];++i){

printf("buk[%d,%d]=%d
",b,i,buk[b][i]);

*p++=buk[b][i];

}

}

}

void getall(){for(int a=0;a<DEMICAL;++a){getb(a);} printf("\n");}

int main(int argc, char *argv[])

{

int
pi[]={34,23,53,66,73,81,13,22,5,98,92,2,35,6,78,81,51,20,63,55,31,61,90,27,77};

int l=sizeof(pi)/sizeof(int);

#define PUSH(b,v) buk[b][++t[b]]=v

for(size_t i=0;i<l;++i){//low demical

int hvb=pi[i]%10;

PUSH(hvb,pi[i]);

}

p=pi;

getall();

(&pi[0],&pi[l],ostream_iterator<int>(cout," "));

printf("\n");

for(int st=0;st<DEMICAL;++st){t[st]=0;}

for(size_t i=0;i<l;++i){//high demical

int hvb=pi[i]/10;

PUSH(hvb,pi[i]);

}

p=pi;

getall();

(&pi[0],&pi[l],ostream_iterator<int>(cout," "));

printf("\n");

return 0;

}

(5)归并排序

template <class T>

void merge(T* begin,T* end,size_t len){

int es=sizeof(*begin);//元素大小

int ss=1;//sub size;//组内元素个数

while(ss<len){

int gs=ss<<1;

int group=len/gs+len%gs;//分组个数

if(gs>group)group=1;

printf("gsize=%d,group=%d,ss=%d===========\n",gs,group,ss);

for(int i=0;i<group;++i){

T* left=&begin[i*gs];

T* mid =&begin[i*gs+gs];

if(i==group-1)mid=end;//always process end element

mergesort<T*>(left,mid,end);//由于两部分已经有序,因此可以使用mergeList方法来实现合并

}

ss<<=1;

}

}
归并的递归实现

void merge(T* begin,T*end){

int* mid=(int*)( ( (int)begin+(int)end )/2 );

if(begin!=mid)merge(begin,mid);

if(mid!=end) merge(++mid,end);

mergesort<T*>(begin,mid,end);//实现方法同上

}

(6)直接选择排序(不稳定)

/*用法

int buf[]={7,3,5,2,4,9,3,12,1,6};

csort(buf,&buf[10]);

*/

template <class T>

void csort(T* begin,T* end){

for(T* b=begin;b!=end;++b){

T* n=b;

++n;

bool op=false;

while(n!=end){

T v=*b;

if(*n<v){

*n^=*b;

*b^=*n;

*n^=*b;

op=true;

}

++n;

}

if(op==false)return;

}

}

(7)快速排序(不稳定)----如果您的实现比我的更简短,欢迎对比:)

/*用法

int buf[]={17,3,15,2,4,9,3,12,1,6};

qsort(&buf[0],&buf[10]);

(&buf[0],&buf[10],ostream_iterator<int>(cout,"
"));

*/

#define swap(x,y) (x)^=(y);(y)^=(x);(x)^=(y)

template <class T>

void qsort(T begin,T end){

T left=begin;

if(++left>=end)return;//只有一个元素了

size_t m= ( (size_t)end-(size_t)begin )/(2*sizeof(T));//STL里面这个中间位置是怎么计算的? int*并没有distace和advance这样对应的迭代方法... ...

T mid=&begin[m];

swap(*begin,*mid);

T last=left;

for(;left!=end;++left){

if(*begin>*left){//找到了更小的数

if(left!=last){

swap(*left,*last);

}

++last;

}

}

qsort(begin,last);

qsort(last,end);

}

(8)希尔排序(不稳定)
可以理解为直接插入排序的变体。这里只给出伪代码:
首先实现一个直接插入排序

void isort(*begin,size_t offset,size_t number);
这里offset是插入排序的间隔,number是插入排序的元素个数

void shellsort(T begin,T end,size_t s){

for(int g=sqr(s);g>1;g=sqr(g)){/A/分组

size_t gs=s/g;//gs 是 group size

for(int n=0;n<gs;++n){//每次分组以后,处理某个组里面全部的元素

isort(begin+n*g, g, g);

}//每个组的所有元素

if(gs*g<s)isort(begin+gs*g,g,s-gs*g);//末尾剩余的元素

}//若干个组

}

(9)最后隆重推出百万级俱乐部成员:
堆排序。程序模板在gcc3.4.2下验证通过

#include<cstdio>

#include<cstdlib>

#include<cstdio>

#include<iostream>

#include<iterator>

using namespace std;

#define swap(x,y) (x)^=(y);(y)^=(x);(x)^=(y)

template <class T>

void hadjust(T heap,size_t len){

size_t sub=len/2;//不大于n/2的整数

while(sub){

size_t left =sub<<1;

size_t right=left+1;

int csub;//需要交换的子节点

if(right>len)csub=left;

else
csub=heap[left-1]>heap[right-1]?left:right;

if(heap[sub-1]>=heap[csub-1]){

--sub;

continue;

}

swap(heap[sub-1],heap[csub-1]);

--sub;

}

}

template <class T>

void hsort(T heap,size_t s){

while(s>1){

hadjust<T>(heap,s);

swap(heap[0],heap[s-1]);

--s;

}

}

int main(void){

int buf[]={17,3,15,2,4,9,3,12,1,6,8,12};

hsort(buf,12);

(&buf[0],&buf[12],ostream_iterator<int>(cout," "));

system("PAUSE");

return 0;

}

c语言编译,将输入的三个值以从小到大的顺序输出,下面的这段程序无法编译,是什么原因,请帮忙改正

你不觉得
scanf("%f,%f,%f",&a,&b,&c);
这句很奇怪吗?
%f之间为什么要加逗号啊。

指针啊,传递指针,传递变量无用。

另外,你的exchange函数为什么要返回“float"?即便如此,你函数内部也没有return 任何变量,编译都不会同过。把第一个float改成void.

最后,也是最关键的错误,你这整个思路就错了,如果是3 2 1,会进行如下操作:
3>2 变成2 3 1
3>1 变成2 1 3
2<3 不变
结果2 1 3

Ⅳ c语言 任意输入5个数从小到大排列 程序怎么写

#include <stdio.h>
int main(int argc, char *argv[])
{
int a[5]; /*保存5个数的数组*/
int i = 0 , j = 0; /*计数器*/
int m = 0 ; /*用于标识最小的那个数*/
int n; /*用于两个数的交换,中间值*/

/*从键盘接收5个数*/
for( i = 0 ; i < 5 ; i ++)
{
printf("请输入第%d个数", i + 1);
scanf("%d",&a[i]);
}

/*排序算法:选择排序*/
for( i = 0 ; i < 5 ; i ++)
{
m = i ;
for( j = i +1 ; j < 5 ; j ++)
if( a[j] < a[m] )
m = j ;
n = a[i];
a[i] = a[m];
a[m] = n;
}

/*输出*/
printf("经过排序后,这些数是:\n");
for( i = 0 ; i < 5 ;i ++)
printf("%d ",a[i]);
printf("\n");
return 0;
}

Ⅳ 编写C语言程序,把一个数组按从小到大的次序排列起来

源程序以及算法注释如下:

#define _CRT_SECURE_NO_WARNINGS//VS编译环境需要进行宏定义,VC6.0可忽略

#include<stdio.h>//输入输出头文件

int main()

{

int number[10], New_number[10];//定义数组的数据类型为整型

int i, j, m, n, k;//定义变量的数据类型为整型

printf("input 10 <int> number:");//文字提示

for (i = 0; i <= 9; i++)//用循环输入数值给数组number并赋给数组New_number

{

scanf("%d", &number[i]);//输入10个整形数字到数组中

New_number[i] = number[i];//数组number元素赋给数组New_number

}

for (n = 0; n <= 8; n++)//要进行(10-1)组比较

for (j = 0; j <= 8 - n; j++)//每组进行(10减第几组)次比较

{

if (number[j] > number[j + 1])//比较大小并将小的赋给前面的数组

{

k = number[j];//将相对较大的元素赋值给中间元素

number[j] = number[j + 1];//将相对较小的元素送达前面一个位置

number[j + 1] = k;//将中间变量元素送给后面一个位置

}

if (New_number[j] < New_number[j + 1])//比较大小并将大的赋给前面的数组

{

k = New_number[j + 1];//将相对较小的元素赋值给中间元素

New_number[j + 1] = New_number[j];//将相对较大的元素送达前面一个位置

New_number[j] = k;//将中间变量元素送给后面一个位置

}

}

printf("min-->max: ");//文字提示

for (m = 0; m <= 9; m++)//依次从小到大输出

printf("%d ", number[m]);//输出元素

printf(" ");

printf("max-->min: ");//文字提示

for (m = 0; m <= 9; m++)//依次从大到小输出

printf("%d ", New_number[m]);//输出元素

printf(" ");

return 0;

}

程序运行结果如下:



(5)编译任意从小加到大的程序扩展阅读:

其他简单实现程序:

#include<stdio.h>

int main()

{

int a[10]={0};

int i,j,temp;

for(i = 0;i<10;i++)

{

scanf("%d",&a[i]);

}

for(i = 0;i<10;i++)

{

for(j = 0;j<10-i-1;j++)

{

if(a[j]>a[j+1])

{

temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

for(i = 0;i<10;i++)

printf("%d ",a[i]);

return 0;

}

Ⅵ c++编译5个数从小到大排列的不用数组的程序

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>

usingnamespacestd;

#definesize10000

inta,b,c,d,e;

voidswap(int&a,int&b){ //交换两个值
intt=a;a=b;b=t;
}

intmain(){
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
while((a>b)||(b>c)||(c>d)||(d>e)){
if(a>b) swap(a,b);
if(b>c) swap(b,c);
if(c>d) swap(c,d);
if(d>e)swap(d,e);
}
printf("%d%d%d%d%d",a,b,c,d,e);
}

Ⅶ 编写java程序:从命令行输入任意个整数,将它们从小到大的顺序输出到屏幕。

import java.util.Scanner;

public class aaa {
public static void main(String[] arg)
{
Scanner sc=new Scanner(System.in);
int []x=new int[3];
for(int i=0;i<3;i++){

System.out.println ("请输入:");
x[i]=Integer.parseInt(sc.next());
}
for (int i = 0; i<x.length-1; i++)
{
for (int j = i+1; j<x.length; j++)
{
if(x[i]>x[j])//小于是从大到小。
{
int t=x[i];
x[i]=x[j];
x[j]=t;
}
}

}
for (int i = 0; i<x.length; i++)
{
System.out.println (x[i]);
}
}

}

Ⅷ 在C语言中 编写一个程序实现从小到大排序

#include<stdio.h>
#include<stdlib.h>

intcmp(constvoid*a,constvoid*b)
{
return*(int*)a-*(int*)b;
}

intmain(intargc,char**argv)
{
inta[]={1,-2,53,49,144,65,267,98,112};
inti;

qsort(a,sizeof(a)/sizeof(int),sizeof(int),cmp);

for(i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d",a[i]);

printf(" ");

return0;
}

如果要自己实现排序函数的话

#include<stdio.h>

voidqsort(int*a,intleft,intright)
{
intp=(left+right)/2;//以中间数作为主元
intk=a[p];
inti=left,j=right;

while(i<j)
{
//从左边开始将大于主元的数放在主元右边
while((i<=p)&&(a[i]<=k))
++i;
if(i<p)
{
a[p]=a[i];
p=i;
}

//从右边开始将小于主元的数放在左边
while((j>=p)&&(a[j]>=k))
--j;
if(j>p)
{
a[p]=a[j];
p=j;
}
}

a[p]=k;
//如果左边的数大于1个则递归左边
if(p-left>1)
qsort(a,left,p-1);
//如果右边的数大于1个则递归右边
if(right-p>1)
qsort(a,p+1,right);
}

intmain(intargc,char**argv)
{
inta[]={1,-2,53,49,144,65,267,98,112};
inti;

qsort(a,0,sizeof(a)/sizeof(int)-1);

for(i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d",a[i]);
printf(" ");

return0;
}

Ⅸ 给任意的三个数字,要求按照从小到大输出,用SQL语句编写一个执行程序

declare @a1 int,@a2 int, @a3 int
select @a1=3,@a2=2,@a3=1 --赋值

select @a1 as a
union
select @a2 as a
union
select @a3 as a
order by a asc
PRINT '结果如网络中所示'

Ⅹ C++从1加到100的程序怎么写

#include <iostream.h>

int main()

{

int sum=0;

for(int i=1;i<=100;i++)

{

sum=sum+i;

}

cout<<sum<<endl;

return 0;

}

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:705
制作脚本网站 发布:2025-10-20 08:17:34 浏览:968
python中的init方法 发布:2025-10-20 08:17:33 浏览:676
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:828
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:737
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1076
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:308
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:188
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:875
python股票数据获取 发布:2025-10-20 07:39:44 浏览:829