----------------------
asp.net+unity開發、.net培訓、期待與您交流!----------------------
剛開始學習c語言的時候,就要接觸到最基本的排序。排序演算法有很多,使用優化的演算法,可以使程式有更高的效率,基本的排序演算法有氣泡排序,選擇排序,快速排序,插入排序,堆排序,歸併排序等,以下將逐一的結合**進行分析。
1、氣泡排序
冒泡是大家接觸最多的方法,其基本原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序,因為形象上感覺像是乙個氣泡乙個氣泡的在向上冒,所以稱之為冒牌排序。
**如下:
int i,j,temp;
for(i=0;ifor(j=i+1;jif(a[i]>a[j])
優缺點:冒泡法原理簡單,但其缺點是交換次數多,效率低。
2、選擇排序
選擇排序迴圈過程與冒泡法一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。
voidchoise(int *a,int n)
int i,j,k,temp;
for(i=0;ik=i; /*給記號賦值*/
for(j=i+1;jif(a[k]>a[j]) k=j; /*是k總是指向最小元素*/
if(i!=k)
} 選擇排序比氣泡排序效率更高。
3、快速排序
快速法定義了三個引數,(陣列首位址*a,要排序陣列起始元素下標i,要排序陣列結束元素下標j). 它首先選乙個陣列元素(一般為a[(i+j)/2],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。然後運用遞迴,在將它左,右兩個子陣列排序,最後完成整個陣列的排序。下面分析其**:
voidquick(int *a,int i,int j)
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i+j)/2]; /*選取的參照*/
do
}while(m<=n);
if(mif(n>i) quick(a,i,n);
4、插入排序
插入排序是一種比較直觀的排序方法。它首先把陣列頭兩個元素排好序,再依次把後面的元素插入適當的位置。把陣列元素插完也就完成了排序。
voidinsert(int *a,int n)
int i,j,temp;
for(i=1;itemp=a[i]; /*temp為要插入的元素*/
j=i-1;
while(j>=0&&tempa[j+1]=a[j];
j--;
} a[j+1]=temp; /*插入*/
} 5、shell排序(希爾排序也屬於一種插入排序)
shell排序是乙個叫 shell 的美國人與2023年發明的。它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。下面讓我們來分析其**:
voidshell(int *a,int n)
int i,j,k,x;
k=n/2; /*間距值*/
while(k>=1)
a[j+k]=x;
} k/=2; /*縮小間距值*/
} 6、堆排序
用堆來實現排序,是一種比較快的排序方法,時間複雜度能達到nlog(n)的程度,空間複雜度是n,下面為堆排序**:
/*假設節點i的左右子樹都是最大堆,操作使節點i的子樹變成最大堆*/
voidmaxheap(int a,int len,int i)
int l,r,large,temp;
l=2*i;
r=2*i+1;
large=i;
if(lif(a[l]>a[i])
large=l;
if(rif(a[r]>a[large])
large=r;
if(large!=i)
temp=a[large];
a[large]=a[i];
a[i]=temp;
maxheap(a,len,large);
/*建立大根堆*/
voidbuildmaxheap(int a,int len)
int i;
for(i=len/2-1;i>=0;i--)
maxheap(a,len,i);
/*堆排序*/
voidmaxheapsort(int a,int len)
int i,temp;
buildmaxheap(a,len);
printf("建立大跟堆\n");
for(i=0;iprintf("%d ",a[i]);
printf("\n");
for(i=len;i>1;i--)
temp=a[0];
a[0]=a[i-1];
a[i-1]=temp;
printf("%d ",a[i-1]);
buildmaxheap(a,i-1);
printf("\n");
7、歸併排序
歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:
1)劃分子表
2)合併半子表
演算法**為:
publicvoid merger(int v, int first, int mid, int last)
queuetempv = newqueue();
int indexa, indexb;
//設定indexa,並掃瞄subarray1[first,mid]
//設定indexb,並掃瞄subarray2[mid,last]
indexa = first;
indexb = mid;
//在沒有比較完兩個子標的情況下,比較 v[indexa]和v[indexb]
//將其中小的放到臨時變數tempv中
while (indexa < mid &&indexb < last)
if (v[indexa] < v[indexb])
tempv.enqueue(v[indexa]);
indexa++;
else
tempv.enqueue(v[indexb]);
indexb++;
//複製沒有比較完子表中的元素
while (indexa < mid)
tempv.enqueue(v[indexa]);
indexa++;
while (indexb < last)
tempv.enqueue(v[indexb]);
indexb++;
int index = 0;
while (tempv.count > 0)
v[first+index] =tempv.dequeue();
index++;
//歸併函式
publicvoid mergersort(int v, int first, int last)
if (first + 1 < last)
int mid = (first + last) / 2;
mergersort(v, first, mid);
mergersort(v, mid, last);
merger(v, first, mid, last);
----------------------
asp.net+unity開發
、.net培訓
、期待與您交流!
----------------------
黑馬程式設計師 C語言 函式
asp.net android ios開發 net培訓 期待與您交流!函式 任何乙個c語言程式都是由乙個或多個程式段構成的,每個程式段都有自己的功能,這些程式段成為函式。所以c語言程式是由函式組成的。當我們需要為程式新增乙個功能的時候,可以定義乙個函式。函式定義 int sub int num1,i...
黑馬程式設計師 C語言 指標
asp.net android ios開發 net培訓 期待與您交流!指標 指標是c語言中非常重要的資料型別 指標變數的定義 int p int是指標指向資料的型別 p是指標變數名稱 只是用來表示變數為指標變數 指標的使用 int a 10 int p p a 或者p a 表示將變數a的記憶體位址賦...
黑馬程式設計師 C語言基礎
ios培訓 android培訓 期待與您交流!一 c語言的流程控制 1 順序結構 按照程式的書寫順序執行每一條語句 2 選擇結構 對給定的條件進行判斷,再根據判斷結果來決定執行哪一段 2.1 if語句 1 if的第一種結構 if 條件 eg include int main return 0 2 i...