編譯任意從小加到大的程序
Ⅰ 編寫程序,建立一個帶有節點的單向鏈表,輸入字元串,並按從小到大順序組織到鏈表中
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;
}

