① 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
② C語言顛倒排序
(1)「冒泡法」 冒泡法大家都較熟悉。其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序。下面列出其代碼:void bubble(int *a,int n) /*定義兩個參數:數組首地址與數組大小*/ { int i,j,temp; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) /*注意循環的上下限*/ if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } 冒泡法原理簡單,但其缺點是交換次數多,效率低。 下面介紹一種源自冒泡法但更有效率的方法「選擇法」。 (2)「選擇法」 選擇法循環過程與冒泡法一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。void choise(int *a,int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; /*給記號賦值*/ for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; /*是k總是指向最小元素*/ if(i!=k) { /*當k!=i是才交換,否則a[i]即為最小*/ temp=a[i]; a[i]=a[k]; a[k]=temp; } } } 選擇法比冒泡法效率更高,但說到高效率,非「快速法」莫屬,現在就讓我們來了解它。 (3)「快速法」 快速法定義了三個參數,(數組首地址*a,要排序數組起始元素下標i,要排序數組結束元素下標j). 它首先選一個數組元素(一般為a[(i+j)/2],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。然後運用遞歸,在將它左,右兩個子數組排序,最後完成整個數組的排序。下面分析其代碼:void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i+j)/2]; /*選取的參照*/ do { while(a[m]<k&&m<j) m++; /* 從左到右找比k大的元素*/ while(a[n]>k&&n>i) n--; /* 從右到左找比k小的元素*/ if(m<=n) { /*若找到且滿足條件,則交換*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } }while(m<=n); if(m<j) quick(a,m,j); /*運用遞歸*/ if(n>i) quick(a,i,n); } (4)「插入法」 插入法是一種比較直觀的排序方法。它首先把數組頭兩個元素排好序,再依次把後面的元素插入適當的位置。把數組元素插完也就完成了排序。void insert(int *a,int n) { int i,j,temp; for(i=1;i<n;i++) { temp=a[i]; /*temp為要插入的元素*/ j=i-1; while(j>=0&&temp<a[j]) { /*從a[i-1]開始找比a[i]小的數,同時把數組元素向後移*/ a[j+1]=a[j]; j--; } a[j+1]=temp; /*插入*/ } } (5)「shell法」 shell法是一個叫 shell 的美國人與1969年發明的。它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。下面讓我們來分析其代碼:void shell(int *a,int n) { int i,j,k,x; k=n/2; /*間距值*/ while(k>=1) { for(i=k;i<n;i++) { x=a[i]; j=i-k; while(j>=0&&x<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=x; } k/=2; /*縮小間距值*/ } } 上面我們已經對幾種排序法作了介紹,現在讓我們寫個主函數檢驗一下。 #include<stdio.h> /*別偷懶,下面的"..."代表函數體,自己加上去哦!*/ void bubble(int *a,int n) { ... } void choise(int *a,int n) { ... } void quick(int *a,int i,int j) { ... } void insert(int *a,int n) { ... } void shell(int *a,int n) { ... } /*為了列印方便,我們寫一個print吧。*/[code]void print(int *a,int n) { int i; for(i=0;i<n;i++) printf("%5d",a[i]); printf("\n"); } main() { /*為了公平,我們給每個函數定義一個相同數組*/ int a1[]={13,0,5,8,1,7,21,50,9,2}; int a2[]={13,0,5,8,1,7,21,50,9,2}; int a3[]={13,0,5,8,1,7,21,50,9,2}; int a4[]={13,0,5,8,1,7,21,50,9,2}; int a5[]={13,0,5,8,1,7,21,50,9,2}; printf("the original list:"); print(a1,10); printf("according to bubble:"); bubble(a1,10); print(a1,10); printf("according to choise:"); choise(a2,10); print(a2,10); printf("according to quick:"); quick(a3,0,9); print(a3,10); printf("according to insert:"); insert(a4,10); print(a4,10); printf("according to shell:"); shell(a5,10); print(a5,10); }
聲明:本答案來自網路網友「 鬍子蕭」 由於本人知識有限只對冒泡法進行了校核。不足之處還請見諒!!!!
③ C語言數組元素逆序排列怎麼做
首先闡述一下逆序對的概念。假設有一個數組為Array[0..n] 其中有元素a[i],a[j].如果 當i<j時,a[i]>a[j],那麼我們就稱(a[i],a[j])為一個逆序對。
那麼統計一個數組中的逆序對,有什麼作用呢。逆序對可以反映插入排序的效率問題,如果逆序對數量多,那麼插入排序的效率就低,反之亦然。
那麼如何快速的找到逆序對的數量,同時又能夠對數組進行排序,並且使得復雜度為O(n*logn)呢?這就可能是一個小問題
看到復雜度為n*logn 有一種親切感,應為我們可以知道歸並排序的時間復雜度為O(n*logn)。 同時歸並排序是通過遞歸的方法建立遞歸樹,利用最小的兩個元素進行對比然後逐層向上進行遞歸,然後對比兩個已經排好序的數組,得到最終完整的排好序的數組。
歸並排序分為了3步驟;
第一步 拆分
第二步進行 計算兩個同樣類型但是規模較小的數組
第三步 合並兩個已排好序的數組
因此從整個數組拆分過程中,我們將它不斷進行拆分,而拆分得到的兩個數組,又是和原數組目的和形式相同的(即都是要排序,同時如果不為最小還要進行以上3步)
這樣可以想到遞歸解決問題,每一層進行相同的3步,知道不能進行位置。那麼這個不能進行的判斷顯得格外重要。
那麼加入了逆序對後,如何考慮呢,實際上很簡單。以為從最下面的含兩個元素的數組,到上層含多個元素的數組都有前後之分,這正好與逆序對性質相符,只要我
們找出前面那一個數組中假設L[i] 大於 後面一個數組中某個元素R[j]
然後就知道前面那個數組在該元素L[i]之後的元素都應該是大於R[j]的。因為在歸並過程我們也進行了排序。
大概思路就是這樣,以下是代碼。
[cpp] view plain
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define Infinite_num 1000
int L[100];
int R[100];
int merge_sort(int Array[],int p,int q,int r)
{
int n1 = q-p+1;
int n2 = r-q;
for(int i=0;i<n1;i++)
{
L[i] = Array[p+i];
}
L[n1] = Infinite_num;
for(i=0;i<n2;i++)
{
R[i] = Array[q+i+1];
}
R[n2] = Infinite_num;
int inversions = 0;
int count = false;
int j=0;
i=0;
for(int k=p;k<=r;k++)
{
if(count==false &&(L[i]>R[j])&&(R[i]!=Infinite_num))
{
inversions = inversions+n1-i;
count = true;
}
if(L[i]<=R[j])
{
Array[k] = L[i];
i++;
}
else
{
Array[k] = R[j];
j++;
count = false;
}
}
return inversions;
}
int merge_inverse(int Array[],int p,int r)
{
int inversions = 0;
int q = -1;
if(p < r)
{
q = (p+r)/2;
inversions = inversions+merge_inverse(Array,p,q);
inversions = inversions+merge_inverse(Array,q+1,r);
inversions = inversions+merge_sort(Array,p,q,r);
}
return inversions;
}
int main(int argc, char* argv[])
{
int Array[] = {1,3,7,8,2,4,6,5};
int inverse_times = 0;
inverse_times = merge_inverse(Array,0,7);
printf("%d",inverse_times);
return 0;
}
④ c語言怎麼把字元串倒序
反序方法見 下面 函數 void op(char *s). 主函數是調用的例子。
#include <stdio.h>
void op(char *s){
int i,k;
char c;
k = strlen(s);
for (i=0;i<k/2;i++){c=s[i];s[i]=s[k-i-1];s[k-i-1]=c;};
};
int main()
{
char s[200];
printf("input one line string:\n");
gets(s);
op(s);
printf("%s\n",s);
return 0;
}
輸入:abc123
輸出:321cba
⑤ c語言如何把數字順序顛倒
顛倒方法:
用演算法實現將一個輸入的數字顛倒(輸入12345->54321),要求不調用任何系統函數,也不能將輸入的數字轉換為字元串作為中間過渡,就可以顛倒了。
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
C語言含義:
C語言是一門面向過程的計算機編程語言,與C++、C#、Java等面向對象編程語言有所不同。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、僅產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
C語言描述問題比匯編語言迅速、工作量小、可讀性好、易於調試、修改和移植,而代碼質量與匯編語言相當。C語言一般只比匯編語言代碼生成的目標程序效率低10%-20%。因此,C語言可以編寫系統軟體。
⑥ c語言倒序程序怎麼編寫
我理解倒序就是原本從大到小,
排成從小到大...(或者反過來)
這樣的話,
最簡單的方法,
編一個循環體:
int
b[N];//假定數組a存放原數據,
b存放倒序後的數據,N為數據個數
for(i=0,j=N;i
=0;i++,j--)
{
b[j]=a[i];
}
如果要求不使用新數組的話,就交換兩頭元素的位置,比如12345,
15交換,24交換:
int
t;
//中間變數t
for(i=0;i
追問:
這樣遞增遞減
變數是什麼
評論
0
0
0
載入更多
⑦ 請問C語言中逆序和倒序什麼意思有什麼區別
如果由小到大是循環,那麼逆序就是由大到小排列了;倒序就是針對當前順序說的,如果當前是順序的,倒序就是逆序,如果是逆序倒序就是順序,是相對的說法。