A. 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),編程簡單,效率高,但是應付的數據范圍不能太大,受到內存大小的限制)。
平時比較常用的就是快速排序,程序簡單,效率也可以接受。
這是我了解的一些東西,希望對你有幫助。
B. 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;
}
(2)c語言中的排序方法擴展閱讀:
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數執行的一種方式。當return語句提供了一個值時,這個值就成為函數的返回值。
return語句用來結束循環,或返回一個函數的值。
1、return 0,說明程序正常退出,返回到主程序繼續往下執行。
2、return 1,說明程序異常退出,返回主調函數來處理,繼續往下執行。return 0或return 1對程序執行的順序沒有影響,只是大家習慣於使用return(0)退出子程序而已。
C. c語言中排序的方法有哪些
排序演算法和語言沒有什麼關系,一般來說面試,考試就是那些
快速排序
冒泡排序
堆排序
D. C語言中有哪些經典的排序方法
穩定的
冒泡排序(bubble sort) — O(n^2)
雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2)
插入排序(insertion sort)— O(n^2)
桶排序(bucket sort)— O(n); 需要 O(k) 額外空間
計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間
合並排序(merge sort)— O(nlog n); 需要 O(n) 額外空間
原地合並排序— O(n^2)
二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間; 需要 O(n) 額外空間
鴿巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 額外空間
基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間
Gnome 排序— O(n^2)
圖書館排序— O(nlog n) with high probability,需要 (1+ε)n額外空間
不穩定的
選擇排序(selection sort)— O(n^2)
希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本
組合排序— O(nlog n)
堆排序(heapsort)— O(nlog n)
平滑排序— O(nlog n)
快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況; 對於大的、亂數列表一般相信是最快的已知排序
Introsort— O(nlog n)
Patience sorting— O(nlog n+ k) 最壞情況時間,需要 額外的 O(n+ k) 空間,也需要找到最長的遞增子串列(longest increasing subsequence)
不實用的排序演算法
Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。
Stupid sort— O(n^3); 遞歸版本需要 O(n^2) 額外存儲器
珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬體
Pancake sorting— O(n),但需要特別的硬體
stooge sort——O(n^2.7)很漂亮但是很耗時
沒事多去網路找!
E. c語言排序方法有哪幾種
C,語言常用的排序方法有很多種。比如說冒泡排序,直接交換排序,直接選擇排序,直接插入排序,二分插入排序,快速排序,歸並排序,二叉排序樹排序,小學生排序,等等。
F. C語言排序有哪些方法 詳細點
排序方法嗎應該和語言沒有太緊密的關系,關鍵看數據類型和結構,一般常用的排序方法有:
1 插入排序——細分的話還可有(1)直接插入排序(2)折半插入排序(3)希爾排序(4)2-路插入排序(5)表插入排序 等
2 比較排序——如冒泡排序,快速排序 等
3 選擇排序——如簡單選擇排序,樹形選擇排序,堆排序 等
4 歸並排序——簡單的如 2-路歸並排序 等
5 基數排序
等等
一般情況下,如果數據不大,只是簡單的自己練習或簡單的幾個十幾個或幾十個數據的話,效率分不出多少來,常用冒泡,直接插入,簡單選擇這幾種簡單的時間復雜度為O(n2)的排序方法就可以。這里舉一個簡單的小例子——比較排序中的——冒泡排序 如下:
//其中a[]是用於排序的數組變數的首地址,也即數組名,a[0]不放數據,
//用於交換時的輔助存儲空間,數據從a[1]開始存放,n表示存放的數據個數
void bubble_sort(int a[], int n){
int i = 0, j = 0, change = 0;//change用於記錄當前次比較是否進行了交換
for(i = n - 1, change = 1; i >= 1 && change; i--){//如果change是0,即已經排好序不用再進行比較了
change = 0;//將當前次的change賦值為0,記錄不交換即下次不用比較了
for(j = 1; j <= i; j++){//內循環依次將相鄰的兩個記錄進行比較
if(a[j] > a[j+1]){//小的前移,最大的移動到本次的最後一項去
a[0] = a[j+1];
a[j+1] = a[j];
a[j] = a[0];
change = 1;//進行了交換的標記
}
}
}
}
G. c語言排序的方法
排序主要分為以下幾種。
1.冒泡排序:通過循環比較前後數的大小進行交換。最後使得數組有序。
2.快速排序:首先將第一個數作為一個基準,然後循環,將前半部分大於該數的與後半部分小於該數的進行交換,使得以該數為分界線,前面的小於該數,後面的大於該數,然後分前後兩部分繼續。
H. c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
I. C語言中的排序法
c語言中排序法有選擇法和冒泡法是最常見的。
1冒泡法對10個數排序
#include<stdio.h>
void
main
()
{
int
a[10];
int
i,j,t;
printf("please
input
10
numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
//進行9次循環,實現9次比較
for(i=0;i<9-j;j++)
//在每一次比較中在進行9-j次比較
if(a[i]>a[i+1])
//相鄰兩數比較大的下沉即交換
{t=a[i+1];
a[i+1]=a[i];
a[i]=t;
}
printf("the
sorted
numbers
:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
不管有多少數只要改變一下都可以實現功能。定義一個大的數組,用多次循環就可以實現。
2選擇法對10個數排序
此法沒有冒泡法方便不在敘述
。