當前位置:首頁 » 編程軟體 » 編譯任意從小加到大的程序

編譯任意從小加到大的程序

發布時間: 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