學(xué)寫簡書
c語言排序算法
兩種方法:選擇與冒泡
-
選擇排序:
首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?。以此類推,直到所有元素均排序完畢。
特點
若按降序排列,第一次比較:則是將數(shù)組的第一個元素與數(shù)組中從第二個元素開始到最后的元素進行比較找到最大的數(shù)記錄下來然后將值賦值給數(shù)組的第一個元素,然后進行第二次比較:則是將數(shù)組的第二個元素與數(shù)組中從第三個元素開始到最后的元素進行比較,找最大的數(shù)記錄下來將值賦值給數(shù)組的第二個元素。。。依次循環(huán)找完。
image.png
代碼:
#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置成無序組起始位置元素下標(biāo)
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);//這里需要將數(shù)列元素個數(shù)傳入。有心者可用sizeof在函數(shù)內(nèi)求得元素個數(shù)。
for(i = 0;i < 6;i++)
{
printf("%d ",num[i]);
}
return 0;
}
-
冒泡排序:
它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。因為越大的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名“冒泡排序”。
特點
- 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
- 對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對,這樣在最后的元素應(yīng)該會是最大的數(shù);
- 針對所有的元素重復(fù)以上的步驟,除了最后一個;
- 重復(fù)步驟1~3,直到排序完成。
image.png
代碼:
#include<stdio.h>
#include<stdlib.h>
void bubblesort(int *p,int len)
{
int i = 0;
int j = 0;
for(i = 0;i<len-1;i++)
{
/*每排序一趟,則至少有一個元素已經(jīng)有序,
用 j<len-i-1 可以縮小排序范圍 */
for(j = 0;j<len -1-i;j++)
{
/*當(dāng)前面的元素大于后面的元素時,交換位置*/
if(p[j]>p[j+1])
{
int tmp = p[j];
p[j] = p[j+1];
p[j+1] = tmp;
}
}
}
}
int main()
{
int num[5]={3,1,5,6,2};
int i=0;
bubblesort(num,5);
for(i=0;i<5;i++)
{
printf("%d ",num[i]);
}
return 0;
}
printf("%d ",num[i]);
}
return 0;
}
來源:
冒泡排序算法及其優(yōu)化
主函數(shù)為int main()中的內(nèi)容。

