A. c語言的兩種排序
1、選擇排序法
要求輸入10個整數,從大到小排序輸出
輸入:2 0 3 -4 8 9 5 1 7 6
輸出:9 8 7 6 5 3 2 1 0 -4
代碼:
#include<stdio.h>
int main(int argc,const char*argv[]){
int num[10],i,j,k,l,temp;
//用一個數組保存輸入的數據
for(i=0;i<=9;i++)
{
scanf("%d",&num<i>);
}
//用兩個for嵌套循環來進行數據大小比較進行排序
for(j=0;j<9;j++)
{
for(k=j+1;k<=9;k++)
{
if(num[j]<num[k])//num[j]<num[k]
{
temp=num[j];
num[j]=num[k];
num[k]=temp;
}
}
}
//用一個for循環來輸出數組中排序好的數據
for(l=0;l<=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
2、冒泡排序法
要求輸入10個整數,從大到小排序輸出
輸入:2 0 3-4 8 9 5 1 7 6
輸出:9 8 7 6 5 3 2 1 0-4
代碼:
#include<stdio.h>
int main(int argc,const char*argv[]){
//用一個數組來存數據
int num[10],i,j,k,l,temp;
//用for來把數據一個一個讀取進來
for(i=0;i<=9;i++)
{
scanf("%d",&num<i>);
}
//用兩次層for循環來比較數據,進行冒泡
for(j=0;j<9;j++)
{
for(k=0;k<9-j;k++)
{
if(num[k]<num[k+1])//num[k]<num[k+1]
{
temp=num[k];
num[k]=num[k+1];
num[k+1]=temp;
}
}
}
//用一個for循環來輸出數組中排序好的數據
for(l=0;l<=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
(1)c語言的排序擴展閱讀:
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數執行的一種方式。當return語句提供了一個值時,這個值就成為函數的返回值。
return語句用來結束循環,或返回一個函數的值。
1、return 0,說明程序正常退出,返回到主程序繼續往下執行。
2、return 1,說明程序異常退出,返回主調函數來處理,繼續往下執行。return 0或return 1對程序執行的順序沒有影響,只是大家習慣於使用return(0)退出子程序而已。
B. C語言選擇法排序
#include<stdio.h>
#defineM 5
void main()
{
int b[M],i,j,t,k;
for(i=0;i<M;i++)
scanf("%d",&b[i]);
for(i=0;i<M-1;i++)
{
for(k=i,j=i+1;j<M;j++)
if(b[k]<b[j])
k=j;
if(i!=k)
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
}
for(i=0;i<M;i++)
printf("%d ",b[i]);
}
錯在大括弧位置加錯了。
代碼:
#include<stdio.h>
void SelectionSort(int *num,int n)
{
int i = 0;
int min = 0;
int j = 0;
int tmp = 0;
for(i = 0;i < n-1;i++)
{
min = i;//每次講min置成無序組起始位置元素下標
for(j = i;j < n;j++)//遍歷無序組,找到最小元素。
{
if(num[min]>num[j])
{
min = j;
}
}
if(min != i)//如果最小元素不是無序組起始位置元素,則與起始元素交換位置
{
tmp = num[min];
num[min] = num[i];
num[i] = tmp;
}
}
}
(此處空一行)
int main()
{
int num[6] = {5,4,3,2,9,1};
int i = 0;
SelectionSort(num,6);//這里需要將數列元素個數傳入。有心者可用sizeof在函數內求得元素個數。
for(i = 0;i < 6;i++)
{
printf("%d ",num[i]);
}
return 0;
}
C. c語言的排序方法有哪些
排序方法其實是數學的計算方法,包括冒泡排序,選擇排序,快速排序等等,計算機語言都能實現這些排序,c語言只是一種實現方式。
D. c語言 排序
1、第二個位置
2、13、51、26、57、23、66、76、81、69
3、第二個位置
選擇跟快速排序最壞情況是 n*(n-1)/2
堆排序最壞情況 o(nlng2n)
E. c語言中排序的方法有哪些
排序演算法和語言沒有什麼關系,一般來說面試,考試就是那些
快速排序
冒泡排序
堆排序
F. c語言三種排序
常用的c語言排序演算法主要有三種即冒泡法排序、選擇法排序、插入法排序。
一、冒泡排序冒泡排序:
是從第一個數開始,依次往後比較,在滿足判斷條件下進行交換。代碼實現(以降序排序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp;
for (int i = 0; i < 10; i++)
{//循環次數
for (int j = 0; j <10 - i-1; j++)
{
if (array[j] < array[j+1])
{//前面一個數比後面的數大時發生交換 temp = array[j];
array[j] = array[j+1];
array[j + 1] = temp;
}
}
} //列印數組 for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}
二、選擇排序以升序排序為例:
就是在指定下標的數組元素往後(指定下標的元素往往是從第一個元素開始,然後依次往後),找出除指定下標元素外的值與指定元素進行對比,滿足條件就進行交換。與冒泡排序的區別可以理解為冒泡排序是相鄰的兩個值對比,而選擇排序是遍歷數組,找出數組元素與指定的數組元素進行對比。(以升序為例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 };
int temp, index;
for (int i = 0; i < 9; i++) {
index = i;
for (int j = i; j < 10; j++)
{
if (array[j] < array[index])
index = j;
}
if(i != index)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for(int i=0;i<10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j;
for(i = 1; i <size; i++)
for(j=i; j>0; j--)
{
if(arr[j] <arr[j-1])
{
temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
G. C語言排序
(1)交換類排序法交換類排序法是指藉助數據元素之間的互相交換進行排序的一種方法。冒泡排序法與快速排序法都屬於交換類排序方法。冒泡排序法是一種最簡單的交換類排序方法,它是通過相鄰數據元素的交換逐步將線性表變成有序。假設線性表的長度為n,則在最壞情況下,冒泡排序需要經過n/2遍的從前往後的掃描和n/2遍的從後往前的掃描,需要的比較次數為n(n–1)/2。但這個工作量不是必需的,一般情況下要小於這個工作量。快速排序法也是一種交換類的排序方法,但由於它比冒泡排序法的速度快,因此稱之為快速排序法。其關鍵是對線性表進行分割,以及對各分割出的子表再進行分割。(2)插入類排序法插入類排序法主要有簡單插入排序法和希爾排序法。簡單插入排序法,是指將無序序列中的各元素依次插入到已經有序的線性表中。在這種排序方法中,每一次比較後最多移掉一個逆序,因此,這種排序方法的效率與冒泡排序法相同。在最壞情況下,簡單插入排序需要n(n–1)/2次比較。希爾排序法對簡單插入排序做了較大的改進。它是將整個無序序列分割成若干小的子序列分別進行插入排序。希爾排序的效率與所選取的增量序列有關。在最壞情況下,希爾排序所需要的比較次數為O(n1.5)。(3)選擇類排序選擇類排序主要有簡單選擇類排序法和堆排序法。簡單選擇排序法的基本思想是:掃描整個線性表,從中選出最小的元素,將它交換到表的最前面(這是它應有的位置);然後對剩下的子表採用同樣的方法,直到子表空為止。對於長度為n的線性表,在最壞情況下需要比較n(n–1)/2次。堆排序法也屬於選擇類排序法。具有n個元素的序列(h1, h2, …, hn),當且僅當滿足條件: 或 (i=1, 2, …, n/2)時稱之為堆。可見,堆頂元素(即第一個元素)必為最大項。堆排序的方法對於規模較小的線性表並不適合,但對於較大規模的線性表來說是很有效的。
H. C語言的排序
1.用數組及指針實現
#include <stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input number of person: n=");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)//以1至n為序給每個人編號
*(p+i)=i+1;
i=0; //i為每次循環時計數變數
k=0; //k為按1,2,3報數時的計數變數
m=0; //m為退出的人數
while(m<n-1) //當退出人數比n-1少時(即未退出人數大於1時)執行循環體
{
if(*(p+i)!=0)k++;
if(k==3) //對退出的人的編號置為0
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0; //報數到最後,i恢復為0
}
while(*p==0)p++;
printf("The last one is No.%d\n",*p);
}
2.用單向循環鏈表實現
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define NULL 0
struct List
{
int data;
struct List *next;
}List;
struct List * InitList(int n)
{//以head為頭結點,建立n個節點的單向循環鏈表,並賦值1-n;返回head指針
struct List *head,*p,*q;
head=(struct List *)malloc(sizeof(struct List));
head->next=head;
head->data=1;
p=head;
int i;
for(i=2;i<=n;i++)
{
q=(struct List *)malloc(sizeof(struct List));
q->data=i;
p->next=q;
q->next=head;
p=p->next;
}
return head;
}
int GetList(struct List *head)
{//從1開始(即head節點)數,
//凡是遇到對3求余為2的節點即刪除它的下一個節點(即被3整的節點),
//變數i+1,循環操作直至只剩下一個節點,返回該節點的編號數
struct List *p,*q;
int i;
for(p=head,i=1;p->next!=p;i++,p=p->next)
if(i%3==2)
{
q=p->next;//以q標記3倍數節點的位置
p->next=p->next->next;//刪除節點
free(q);//釋放被刪除的節點內存
i++;//補回刪除節點的一次自增
}
return p->data;
}
void main()
{
struct List * head;
int n,num;
do
{
system("cls");//清屏
printf("\ninput the n:");
scanf("%d",&n);//輸入n
if(n>0)head=InitList(n);//如果n>0則建立循環鏈表
else exit(NULL);//否則退出程序
num=GetList(head);//進行逢3剔除操作,並將返回值賦給num
printf("\n\nthe last one is %d\n\n\n",num);//顯示最後剩下的節點編號
system("pause");//暫停屏幕
}while(1);
}
I. c語言排序的方法
排序主要分為以下幾種。
1.冒泡排序:通過循環比較前後數的大小進行交換。最後使得數組有序。
2.快速排序:首先將第一個數作為一個基準,然後循環,將前半部分大於該數的與後半部分小於該數的進行交換,使得以該數為分界線,前面的小於該數,後面的大於該數,然後分前後兩部分繼續。
J. 用c語言排序的方法
main()
{
int a,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b){t=a,a=b,b=t}
if(a>c) {t=a,a=c,c=t)}
if(b>c) {t=b,b=c,c=t)}
printf("%d %d %d",a,b,c);
getch();
}