A. 急求:用c語言程序對一組大小不定的數字排序拜託了各位 謝謝
第一個就是冒泡排序法,幾乎是最簡單的排序方法:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
冒泡排序法進行排序
for(
i
=
0;
i
<
N
-
1;
i++
){
for(
j
=
0;
j
<
N-i-1;
j++
){
if(
a[i]
<
a[j]
){
temp
=
a[i]
;
a[i]
=
a[j]
;
a[j]
=
temp
;
}
}
}//第一個for
printf("你是入的十個數是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是選擇排序法,比冒泡排序法的效率高:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
k,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
選擇排序法進行排序
for(
i
=
0;
i
<
N
-
1;
i++
){
k
=
i
;
for(
j
=
i
+
1;
j
<
N;
j++
){
if(
a[k]
<
a[j]
){
k
=
j
;
}
temp
=
a[i]
;
a[i]
=
a[k]
;
a[k]
=
temp
;
}
}//第一個for
printf("你是入的十個數是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是插入排序法,比冒泡排序法和選擇排序法的效率都要高:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
int
main(
void
)
{
int
i,
j,
key,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
//
插入排序法進行排序
for(
i
=
1;
i
<
N
;
i++
){
key
=
a[i]
;
for(
j
=
i
-
1;
j
>=
0;
j--
){
if(
a[j]
<
key
){
a[j+1]
=
a[j]
;
}
}
a[j+1]
=
key
;
}//第一個for
printf("你是入的十個數是:\n")
;
for(
i
=
0;
i
<
N;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
下面的是歸並排序法,我是在看了《演算法導論》之後才寫的,我自己寫不出來。代碼寫出來很簡單,比其它一些書上的簡單多了。歸並排序法的效率是這四個排序法中效率最高的:
#include
<stdio.h>
#include
<conio.h>
#define
N
10
void
merge_sort(
int
*a,
int
p,
int
q,
int
r
)
{
int
i,
j,
k,
m,
n
;
int
array1[N],
array2[N]
;
//
m和n分別是新建立的兩個數組中
//
元素的個數
m
=
q
-
p
+
1
;
n
=
r
-
q
;
//
先把數組a[N],中的元素放進
//
新建立的兩個數組中
for(
i
=
0;
i
<
m;
i++
){
array1[i]
=
*(
a
+
p
+
i
)
;
}
for(
j
=
0;
j
<
n;
j++
){
array2[j]
=
*(
a
+
q
+
j
+1
)
;
}
i
=
j
=
0
;
k
=
p
;
//
k
不能被初始化為
0
//
開始歸並
while(
i
<
m
&&
j
<
n
){
if(
array1[i]
>
array2[j]
){
*(
a
+
k
)
=
array1[i]
;
++
k
;
++
i
;
}
else{
*(
a
+
k
)
=
array2[j]
;
++
k
;
++
j
;
}
}
//
歸並每個數組剩下的元素
while(
i
<
m
){
*(
a
+
k
)
=
array1[i]
;
++
k
;
++
i
;
}
while(
j
<
n
){
*(
a
+
k
)
=
array2[j]
;
++
k
;
++
j
;
}
}
void
merge(
int
*a,
int
p,
int
r
)
{
int
q
;
//
p
>=
r的情況就是要排序的元素只有一個,
//
也就是說,它已經被排好了
if(
p
<
r
){
q
=
(p
+
r)/2
;
merge(
a,
p,
q
)
;
merge(
a,
q
+
1,
r
);
merge_sort(
a,
p,
q,
r
);
}
}//
merge
int
main(
void
)
{
int
i,
j,
key,
temp
;
int
a[N]
=
{0,1,2,3,4,5,6,7,8,9};
merge(
a,
0,
9)
;
printf("你是入的十個數是:\n")
;
for(
i
=
0;
i
<
10;
i++
){
printf("%d
",a[i]
)
;
}
getch()
;
return
0
;
}
B. c語言如何將一個數組中的數值排好順序
使用冒泡排序法進行編程:
解釋:
1.第一個for循環:利用數組循環輸入4個變數。
2.第二個for循環:該循環的意思是如果a[0]>a[1]的話,兩個變數的值交換,利用循環依次比較。要注意的是i<3,因為其中有i+1,i最大取到2,也就是i+1最大取到3才正確。
3.第三個for循環:利用循環依次輸出排序後的數組,每輸出一個加一個空格以便於區分。
(2)c語言數字組成的排列擴展閱讀:
冒泡排序法,從數組頭部開始,不斷比較相鄰的兩廳笑個元素的大小,通過交換兩個元素的值使較大的元素逐漸銀物往後移動,扮搏含直到數組的末尾。
經過第一輪的比較,就可以找到最大的元素,並將它移動到最後一個位置。第一輪結束後,繼續第二輪。仍然從數組頭部開始比較,讓較大的元素逐漸往後移動,直到數組的倒數第二個元素為止。
經過第二輪的比較,就可以找到次大的元素,並將它放到倒數第二個位置。
以此類推,進行 n-1(n 為數組長度)輪「冒泡」後,就可以將所有的元素都排列好。
C. C語言數字排序
輸入scanf是用的變數地址
&x
&y
&z
輸出時,是用的變數x,
y,
z
所以sort3要改變這3個變數地址(指針)指向的值
#include
<stdio.h>
void
sort3(double
*x,
double
*y,
double
*z);
int
main(int
argc,
char
*argv[]){
double
x,y,z;
if(scanf("%lf
%lf
%lf",&x,&y,&z)==3){
sort3(&x,&y,&z);
printf("%lf\n%lf\n%lf\n",x,y,z);
}else{
fprintf(stderr,"Error:
Incorrect
format\n");
}
return
0;
}
void
sort3(double
*x,
double
*y,
double
*z){
double
a
=
*x,
b
=
*y,
c
=
*z;
printf("a:%f
b:%f
c:%f\n",a,
b,
c);//testing
if(*x
>
*y)
{
a
=
*y;
b
=
*x;
}
if(c
<
a)
{
*x
=
c;
*y
=
a;
*z
=
b;
}
else
if(c
<
b)
{
*x
=
a;
*y
=
c;
*z
=
b;
}
else
{
*x
=
a;
*y
=
b;
*z
=
c;
}
printf("sorted
numbers:\n");//testing
printf("%f
%f
%f\n",*x,
*y,
*z);//testing
}
D. 用c語言編寫程序,輸出7,8,9三個數字的全部排列組合順序
voidmain()
{
intmaxRow=5;//輸出行數
intnum=1;
for(inti=0;i<maxRow;i++)
{
for(intj=0;j<=i;j++)
{
printf(num++);
printf(" ");
}
printf(" ");
}
}
E. C語言~十個數字從小到大怎麼排列~從大到小呢~
//要求任意輸入10個數,然後按從小到大順序輸出
#include <stdio.h>
int main()
{
int a[10];
int i,j;
int temp;
printf("請輸入10個整數:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("排列後順序為:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("
");
return 0;
}
F. 在C語言中,如何輸出一組數的排列組合
#include <stdio.h>
#include <stdlib.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf(" ");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//輸入自然數的個數
printf("請輸入連續自然數的個數:");
scanf("%d",&k);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);
return 0;
}
該程序的輸入為一個任意自然數n,將輸出從1到n的全排列。
(6)c語言數字組成的排列擴展閱讀:
C語言的基本數的排列法
1、冒泡排序:每次相鄰兩個數比較,若升序,則將大的數放到後面,一次循環過後,就會將最大的數放在最後。
#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)//n個數,總共需要進行n-1次
{ //n-1個數排完,第一個數一定已經歸位
//每次會將最大(升序)或最小(降序)放到最後面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,進行交換
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf(" ");
}
return 0;
}
2、選擇排序:從第一個數開始,每次和後面剩餘的數進行比較,若升序,則如果後邊的數比當前數字小,進行交換,和後面的所有的數比較、交換後,就會將當前的最小值放在當前的位置。
#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;
}
G. c語言編程: 將一組數按從大到小的順序排序
#include <stdio.h>
main()
{
int x;
printf("請輸入要排序數字個數:");
scanf("%d",&x);
int i,j,k,a,b,num[x];
printf("輸入數據:");
for(i=0;i<x;i++)
scanf("%d",&num[i]);
for(j=0;j<x;j++)
{
for(k=j+1;k<x;k++)
if(num[k]>num[j])
{
a=num[j];
num[j]=num[k];
num[k]=a;
}
}
for(b=0;b<x;b++)
printf("%d ",num[b]);
return 0;
}
(7)c語言數字組成的排列擴展閱讀:
include用法:
#include命令預處理命令的一種,預處理命令可以將別的源代碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程序代碼;可以定義類似標識符功能的宏,在編譯時,預處理器會用別的文本取代該宏。
插入頭文件的內容
#include命令告訴預處理器將指定頭文件的內容插入到預處理器命令的相應位置。有兩種方式可以指定插入頭文件:
1、#include<文件名>
2、#include"文件名"
如果需要包含標准庫頭文件或者實現版本所提供的頭文件,應該使用第一種格式。如下例所示:
#include<math.h>//一些數學函數的原型,以及相關的類型和宏
如果需要包含針對程序所開發的源文件,則應該使用第二種格式。
採用#include命令所插入的文件,通常文件擴展名是.h,文件包括函數原型、宏定義和類型定義。只要使用#include命令,這些定義就可被任何源文件使用。
H. c語言把十個數排列在一起,怎樣使它們最大的三個數用序號表示
你的問題是對十個數字,找出其中最大的三個數的序號(對應數組的下標和皮哪)。
方法不止一種,我的思路:
1、隨機數生成10個數字組成數組num。
2、定義一個數組x,用於保存最大三個數字的下標(數字大小是從大到小)。
3、遍歷num找出數組最小值的下標,將其保存到變數mi中。
4、用mi的值初始化x(也就是初始三個數都對應最小數字)。
5、再次遍歷num,每次和x中對應的每一數對比,發現大於的,則當前x元素全部往後移動一位,並且將當前數值下標記錄在x當前元素內。
最後得到的數組x就是題目要的序號。
PS:寫程序考慮要擴展和通用,因此所有參數(數字個數,數字位數,最大數的個數)都定義成常量,只要修改常量可適應n個數排列,求最大m個數的序號。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MN 10//最大數字個數
#define N 100//單個數字不超過
#define M 3//想要統計的最大數量(題目要最大前3,可改其它值)
int main()
{
int i=0,num[MN],mi=0,x[M]={0},*p=&x[0],*p2=NULL;
srand(time(NULL));
printf("數組(隨機)為: ");
while(i<MN)
{
num[i]=rand()%N;
if(num[i]<num[mi])mi=i;//找出最小值序號
printf("%d ",num[i++]);
}
for(i=0;i<M;i++)x[i]=mi;//用最小值下標初始化x數組
printf(" ");
i=0;
while(i<MN)
{
p=&x[0];
while(1)
{
if(num[i]>num[*p])
{
p2=&x[M-1];
while(p2>p)*p2=*(p2-1),p2--;//x當前位往後依次後移
*p=i;
break;
}
else p++;
if(p>&x[M-1])
break;
}
i++;
}
printf(" 其中最大的三個數組序號分別為(序號從0開始): ");
for(i=0;i<M;i++)
printf("數字%d,序號%d。 ",num[x[i]],x[i]);
return 0;
}
I. 用c語言怎麼實現排列組合啊比如從100個數裡面任意選出5個數,即C100 5……
#include<stdio.h>
void main()
{
int n = 100;
int m = 5;
int n1 = 1, m1 = 1;
for(int i = 1; i <= m; i++)
{
n1 *= n - i + 1;
m1 *= i;
}
n1 = n1/m1;
printf("C100 5 = %d\n",n1);
}
從n中選出m個,只要改變n和m的值即可,VS2010下測試通過。
J. C語言,輸入一組數進行排序,由大到小排列,用自定義函數實現
給你一個直接插入排序
#include "stdio.h"
void InsertSort(int a[], int left, int right) {//對數組a從下標為left到right區域進行直接插入排序
int i, j, tmp;
for(i = left + 1; i <= right; i++) {
for(j = i - 1, tmp = a[i]; j >= left && tmp > a[j]; j++)
a[j + 1] = a[j];
a[j + 1] = tmp;
}
}
void main( ) {
int i, n, a[100];
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
InsertSort(a, 0, n - 1);
printf("\n");
for(i = 0; i < n; i++) printf("%d\t", a[i]);
}