1. 求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;
}
(1)常用排序演算法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;
}
2. C語言排序的方法
現在流行的排序有:直接插入排序、冒泡排序、簡單選擇排序、希爾排序、快速排序、堆排序、歸並排序、基數排序。
對n個記錄進行選擇排序的方法是:通過n-i次關鍵字之間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1<=i<=n)個記錄進行交換,當i等於n時所有記錄都已有序排列。
void selectsort(int data[],int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(data[j]<data[k]) k=j;
if(k!=i)
{
temp=data[i];data[i]=data[k];data[k]=temp;
}//if
}//for
}//for
}//selectsort
3. C語言冒泡排序法是什麼
冒泡排序法,是C語言常用的排序演算法之一,意思是對一組數字進行從大到小或者從小到大排序的一種演算法。
具體方法是:
相鄰數值兩兩交換。從第一個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換(對調);如果其與我們的期望一致,則不用交換。重復這樣的過程,一直到最後沒有數值需要交換,則排序完成。
C語言常見的排序演算法:
1、冒泡排序
基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組後面。
2、快速排序
基本思想:選取一個基準元素,通常為數組最後一個元素(或者第一個元素)。從前向後遍歷數組,當遇到小於基準元素的元素時,把它和左邊第一個大於基準元素的元素進行交換。在利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。
3、直接插入排序
基本思想:和交換排序不同的是它不用進行交換操作,而是用一個臨時變數存儲當前值。當前面的元素比後面大時,先把後面的元素存入臨時變數,前面元素的值放到後面元素位置,再到最後把其值插入到合適的數組位置。
4、直接選擇排序
基本思想:依次選出數組最小的數放到數組的前面。首先從數組的第二個元素開始往後遍歷,找出最小的數放到第一個位置。再從剩下數組中找出最小的數放到第二個位置。以此類推,直到數組有序。
以上內容參考 網路-排序演算法、網路-c語言冒泡排序
4. c語言排序
下面是C語言裡面常用的三種排序方法,但願對樓主有幫助,
一、冒泡法(起泡法)
演算法要求:用起泡法對10個整數按升序排序。
演算法分析:如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元素位置),最大值沉底為升序,最小值沉底為降序。
演算法源代碼:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
/*輸入源數據*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);
/*排序*/
for(j=0;j<9;j++) /*外循環控制排序趟數,n個數排n-1趟*/
for(i=0;i<9-j;i++) /*內循環每趟比較的次數,第j趟比較n-j次*/
if(a[i]>a[i+1]) /*相鄰元素比較,逆序則交換*/
{ t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
/*輸出排序結果*/
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
演算法特點:相鄰元素兩兩比較,每趟將最值沉底即可確定一個數在結果的位置,確定元素位置的順序是從後往前,其餘元素可能作相對位置的調整。可以進行升序或降序排序。
演算法分析:定義n-1次循環,每個數字比較n-j次,比較前一個數和後一個數的大小。然後交換順序。
二、選擇法
演算法要求:用選擇法對10個整數按降序排序。
演算法分析:每趟選出一個最值和無序序列的第一個數交換,n個數共選n-1趟。第i趟假設i為最值下標,然後將最值和i+1至最後一個數比較,找出最值的下標,若最值下標不為初設值,則將最值元素和下標為i的元素交換。
演算法源代碼:
# include
main()
{
int a[10],i,j,k,t,n=10;
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++) /*外循環控制趟數,n個數選n-1趟*/
{
k=i; /*假設當前趟的第一個數為最值,記在k中 */
for(j=i+1;j<n;j++) /*從下一個數到最後一個數之間找最值*/
if(a[k]<a[j]) /*若其後有比最值更大的*/
k=j; /*則將其下標記在k中*/
if(k!=i) /*若k不為最初的i值,說明在其後找到比其更大的數*/
{ t=a[k]; a[k]=a[i]; a[i]=t; } /*則交換最值和當前序列的第一個數*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
演算法特點:每趟是選出一個最值確定其在結果序列中的位置,確定元素的位置是從前往後,而每趟最多進行一次交換,其餘元素的相對位置不變。可進行降序排序或升序排序。
演算法分析:定義外部n-1次循環,假設第一個為最值,放在參數中,在從下一個數以後找最值若後面有比前面假設的最值更大的就放在k中,然後在對k進行分析。若k部位最初的i值。也就是假設的i不是最值,那麼就交換最值和當前序列的第一個數
三、插入法
演算法要求:用插入排序法對10個整數進行降序排序。
演算法分析:將序列分為有序序列和無序列,依次從無序序列中取出元素值插入到有序序列的合適位置。初始是有序序列中只有第一個數,其餘n-1個數組成無序序列,則n個數需進n-1次插入。尋找在有序序列中插入位置可以從有序序列的最後一個數往前找,在未找到插入點之前可以同時向後移動元素,為插入元素准備空間。
演算法源代碼:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++) /*外循環控制趟數,n個數從第2個數開始到最後共進行n-1次插入*/
{
t=a[i]; /*將待插入數暫存於變數t中*/
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下標0 ~ i-1)中尋找插入位置*/
a[j+1]=a[j]; /*若未找到插入位置,則當前元素後移一個位置*/
a[j+1]=t; /*找到插入位置,完成插入*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
演算法特點:每趟從無序序列中取出第一個數插入到有序序列的合適位置,元素的最終位置在最後一趟插入後才能確定位置。也可是先用循環查找插入位置(可從前往後或從後往前),再將插入位置之後的元素(有序列中)逐個後移一個位置,最後完成插入。該演算法的特點是在尋找插入位置的同時完成元素的移動。因為元素的移動必須從後往前,則可將兩個操作結合在一起完成,提高演算法效率。仍可進行升序或降序排序。
二、下面是三種排序的概念及其優缺點
冒泡排序
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],依此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數已知;
缺點:慢,每次只能移動相鄰兩個數據,移動數據的次數多。
選擇排序
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],依此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數與冒泡排序一樣,數據移動次數比冒泡排序少;
缺點:相對之下還是慢。
插入排序
已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合並成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)
優點:穩定,快;
缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。
5. 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),編程簡單,效率高,但是應付的數據范圍不能太大,受到內存大小的限制)。 平時比較常用的就是快速排序,程序簡單,效率也可以接受。 這是我了解的一些東西,希望對你有幫助。
6. 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;
}
}
}