『壹』 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]);
『貳』 C語言用一維數組,輸入學生成績和姓名,將成績從高到低排序,對姓名做相應的調整,輸出排序後的成績姓名
一維數組 按你理解應該怎麼存儲多個名字?
一維char是一個連續的字元串 所以你使用b[i]訪問他的時候 只能讀取或寫入一個字元 而名字是有多個字元組成的。
用一維數組表示字元串是比較麻煩的 你可以先定義一個大的char數組
比如 char b[最大名字個數*10]
然後 再
for(int i=0;i<3;i++){
scanf("%s",&b[i*10]);//每一次循環向後移動10個字元位置
}
然後說一下 你gets(b[i]) 函數應該傳char* 也就是字元指針 而不是字元 應該是 &b[i]
再就是沒有看到聲明p變數
最後查一下排序有沒有問題吧
『叄』 C語言考試試題:定義一個100位學生的結構體數組,按成績從高到低進行排序
我現寫的一個,簡潔明了,應該是符合你的口味的,測試完全通過
#include <stdio.h>
#define N 100
typedef struct student
{
int id; //學號
char name[20]; //姓名
int gender; //性別(0代表男生,1代表女生)
float score; //成績
}stu;
stu s[N];
int main()
{
int i;
for(i=0;i<N;i++)
{
printf("請輸入第%d個學生的學號:",i+1);
scanf("%d",&s[i].id);
printf("請輸入第%d個學生的姓名:",i+1);
scanf("%s",&s[i].name);
printf("請輸入第%d個學生的性別:",i+1);
scanf("%d",&s[i].gender);
printf("請輸入第%d個學生的成績:",i+1);
scanf("%f",&s[i].score);
}
stu ss[N];
stu* p=ss;
for(i=0;i<N;i++)
ss[i]=s[i];
for(i=0;i<N-1;i++)
{
for(int j=i+1;j<N;j++)
{
if(ss[i].score<ss[j].score)
{
stu temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
printf("所有學生的信息按成績由高到低排名如下:\n");
printf("學號\t姓名\t性別\t成績\n");
for(i=0;i<N;i++)
{
printf("%d\t%s\t%d\t%.1f\n",(p+i)->id,(p+i)->name,(p+i)->gender,(p+i)->score);
}
return 0;
}
『肆』 c語言數組的排序
可以採用冒泡排序的方法。以下給題主一個對既定數組進行升序、降序排序的代碼
#include<stdio.h>
#include<time.h>
#defineelemTypeint/*元素類型*/
#defineLEN100/*數組長度上限*/
#defineASC0/*升序*/
#defineDESC1/*降序*/
/*冒泡排序*/
/*參數說明:*/
/*elemTypearr[]:排序目標數組*/
/*intlen:元素個數*/
/*intorder:排序方式;升序(由小到大):ASC;降序(由大到小):DESC*/
voidbubbleSort(elemTypearr[],intlen,intorder){
inti,j,temp;
for(i=0;i<len-1;i++)
for(j=0;j<len-1-i;j++){
if(order==ASC){/*升序*/
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
elseif(order==DESC){/*降序*/
if(arr[j]<arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
/*列印數組*/
voidprintArr(elemTypearr[],intlen){
inti;
for(i=0;i<len;i++)
printf("%d ",arr[i]);
putchar(' ');
}
intmain(void){
elemTypearr[LEN]={3,5,1,7,2,9,6,8,10,4};
intlen;
len=10;
puts("初始數組:");
printArr(arr,len);
putchar(' ');
puts("升序排列:");
bubbleSort(arr,len,ASC);/*升序冒泡排序*/
printArr(arr,len);
putchar(' ');
puts("降序排列:");
bubbleSort(arr,len,DESC);/*降序冒泡排序*/
printArr(arr,len);
putchar(' ');
getch();/*屏幕暫留*/
return0;
}
運行結果
『伍』 C語言數組排序方法
選擇排序的原理是,每次從待排序數字中挑選出最大(最小)數字,放在有序序列的末尾。實際操作中,只需要在這個數組中將挑出來的數字與前面的數字交換即可。例如:4
1 5
2 3找到最小的1,1和4交換1
4 5
2
3找到最小的2,2和4交換1
2
5
4
3找到最小的3,3和5交換1
2
3
4
5找到最小的4,4和4交換(不交換也可)可見,選擇排序需要一個雙重循環來完成,因此它的復雜度是O(n^2)在數據量比較大時,不建議使用這種排序方法。 其他排序方法有很多,你甚至可以自己根據不同數據規模設計不同的排序方法。比較常見的有冒泡排序,插入排序(這兩種和選擇排序一樣,都是O(n^2)),二分法插入排序(降低了一些復雜度,但是涉及到大規模數據移動,效率依然不高),快速排序(平均復雜度O(nlogn),但是不穩定,最壞情況O(n^2)),隨機化快速排序(很大程度上避免了最壞情況的出現),堆排序(O(nlogn),編程復雜度高),基數排序(理論復雜度O(n),實際要比這個慢。甚至能應付字元串排序,但是編程復雜度高,牽扯到其他數據結構),桶排序(O(n),編程簡單,效率高,但是應付的數據范圍不能太大,受到內存大小的限制)。 平時比較常用的就是快速排序,程序簡單,效率也可以接受。 這是我了解的一些東西,希望對你有幫助。
『陸』 c語言數組從小到大排序
#include<stdio.h>
int main(void)
{
int n, i, index, k, temp = 0;
int a[10];
printf("Enter n:");
scanf("%d", &n);
printf("Enter %d numbers:", n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (k = 0; k < n; k++)
{
index = k;
for (i = k + 1; i < n; i++)
{
if (a[i] > a[index])
index = i;
temp = a[index];
a[index] = a[k];
a[k] = temp;
}
}
for (i = 0; i < n; i++)
printf("%d", a[i]);
return 0;
}
這是修改了的
你的思路沒錯,就是在第三個for後要個大括弧把
if(a[i]>a[index])
index=i;
temp=a[index];
a[index]=a[k];
a[k]=temp;括起來。
『柒』 c語言 數組 從大到小排序
#include<stdio.h>
int
main(void)
{
int
n,
i,
index,
k,
temp
=
0;
int
a[10];
printf("Enter
n:");
scanf("%d",
&n);
printf("Enter
%d
numbers:",
n);
for
(i
=
0;
i
<
n;
i++)
scanf("%d",
&a[i]);
for
(k
=
0;
k
<
n;
k++)
{
index
=
k;
for
(i
=
k
+
1;
i
<
n;
i++)
{
if
(a[i]
>
a[index])
index
=
i;
temp
=
a[index];
a[index]
=
a[k];
a[k]
=
temp;
}
}
for
(i
=
0;
i
<
n;
i++)
printf("%d",
a[i]);
return
0;
}
這是修改了的
你的思路沒錯,就是在第三個for後要個大括弧把
if(a[i]>a[index])
index=i;
temp=a[index];
a[index]=a[k];
a[k]=temp;括起來。
『捌』 c語言將數組從小到大排序
#include<stdio.h>
intmain()
{
inta[20];
inti,j,temp;
int*p=&a[0];
int*d;
intn;
printf("請輸入數組長度");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("請輸入這個數組 ");
scanf("%d",p++);//<=================
}
for(p=a;p<a+n;p++)//<=================
{
for(d=p+1;d<a+n;d++)//<=================
{
if(*p>*d)
{
temp=*p;
*p=*d;
*d=temp;
}
}
}
p=a;
for(p;p<a+n;p++)
{
printf("%d ",*p);
}
return0;
}
『玖』 求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;
}
(9)c語言數組從低到高排序擴展閱讀:
其他將數組從小到大排序的演算法
以下使用的是選擇排序法實現數組從小到大排序。
思想:從第一個數開始,每次和後面剩餘的數進行比較,若升序,則如果後邊的數比當前數字小,進行交換,和後面的所有的數比較、交換後,就會將當前的最小值放在當前的位置
輸入的序列為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語言程序,把一個數組按從小到大的次序排列起來
源程序以及演算法注釋如下:
#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;
}
程序運行結果如下:
(10)c語言數組從低到高排序擴展閱讀:
其他簡單實現程序:
#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;
}