三種排序對比:選擇法,插入法,冒泡法html
三種排序都是最基本的,時間複雜度最大爲O(n*n)的排序方法。這裏給出的是採用數組形式的簡單序列排序(從小到大)。數組
/*選擇法*/
/*選擇法的基本思路:第一次,從第一個記錄後面待排序的的記錄中,選出最小的,和第一個交換。而後,循環作n次,這樣排完後成序*/
/*選擇法排序是不穩定的:由於兩個相同的記錄偏偏要反序放置*/
#include
int main()
{
int a[10]={4,6,8,2,0,1,5,7,3,9};/*定義數組*/
int i,j,k;
for(j=0;j
for(i=j+1;i
if(a[i]
k=a[i];
a[i]=a[j];;
a[j]=k;
}/*用中間變量k作交換*/
for(j=0;j<=9;j++)printf("%d\n",a[j]);
system("pause");
}數據結構
/*冒泡法*/
/*冒泡法的基本思路和選擇法不一樣,以下程序,第一次,經過記錄的「兩兩」比較將全部記錄中最大的記錄放到最後去。而後循環9次便可*/
/*冒泡法排序是穩定的:冒泡的過程當中相同的記錄位置不會變*/
#include
int main()
{
int a[10]={4,6,8,2,0,1,5,7,3,9};
int i,j,k;
for(j=0;j
for(i=0;i
if(a[i]>a[i+1]){
k=a[i];
a[i]=a[i+1];
a[i+1]=k;
}
for(j=0;j<=9;j++)printf("%d\n",a[j]);
system("pause");
}htm
/*插入法*/
/*插入法的的意思就和咱們抓牌同樣,把記錄分爲有序和無序兩區。把無序區中的每一個數「挨個」拿來和有序區的數比較。比有序區小的位置保持不變,大的話先挪動位置空出來,再插入*/
/*插入法也是穩定的:插入的過程當中相同的記錄位置不變。*/
#include
int main()
{
int a[10]={9,2,2,5,6,7,4,5,1,0},i,j,k,m;
for(i=1;i<=9;i++)
{
m=a[i]; /*將a[i]先拿出來*/
for(j=i-1;j>=0 && mblog
/*在挪位置後要保存j的值即插入位置:j-- 。因此 循環終止條件有m ]*/
a[j+1]=a[j];
a[j+1]=m; /*大的從新原位置插入,小的在挪動後的位置插入*/
}
for(k=0;k<=9;k++)
printf("%d\n",a[k]);
system("pause");
}排序
大部分數據結構書上插入排序的寫法,感受用while反而不太清楚:get
#include
int main()
{
int i,j,k,l;
int a[10]={4,6,8,2,0,1,5,7,3,9};
for(i=1;i<=9;i++) /*第一個a[0]做爲有序的。從第二個依次拿來比較*/
{
k=a[i];/*比較的數先抽出來放到中間變量k中*/
j=i-1; /*用j作循環判斷,從「右到左」依次比較!*/
while(j>=0 && a[j]>k) /*若是比k大且不爲a[-1]則挪位置*/
{
a[j+1]=a[j];
j--; /*j--在這裏的做用值得細心領會。j在外循環中處於抽出來的記錄的前一個。這裏,在有序區中找到比k大的則向右邊挪動位置,j這時處於比k大的那個記錄的前面一個了!*/
}
a[j+1]=k; /*這時a[j+1]是挪出的空位,把k插入,若是不比k小,則插在本身原來位置*/
}
for(l=0;l<=9;l++)
printf("%d\n",a[l]);
system("pause");
}it
引用地址:http://blog.programfan.com/trackback.asp?id=30329變量