1.冒泡排序法:
假設有n個數需要按從小到大排序,冒泡排序的原理是,在這一排數字中,將第一個數與第二個數比較大小,如果后面的比前面的小,就將他們交換位置.然后再比較第二個和第三個,再交換,直到第n-1個和第n個,此時第n個就是這n個數中最大,然后再重新找第二大的放在第n-1的位置...
在c編程中是通過兩個嵌套的循環,內循環控制比較時的下標(從0到放最大的數的下標之前),外循環控制總的次數(放最大的數的下標到1),以及內循環的比較次數,其中要注意的是總的剩余的次數等於該次外循環中內循環的初始比較次數,外循環的初始次數為n-1,因為要排n個數,只需要弄好n-1個數的位置就好了,內循環的初始次數和外循環一樣,因為n個數,按順序拿一個數與后面的數比較大小,最后那個數后面沒有和他比較的,所以也是n-1次.和外循環次數相同.
#include <stdio.h> void main() { int a[10] = { 5,1,6,9,8,3,4,6,10,7 }; int temp = 0; for (int j = 9; j>0; j--) { for(int i=0;i<j;i++) { if (a[i]>a[i+1]) { temp = a[i]; a[i] = a[i+1]; a[i + 1] = temp; } } } for (int i = 0; i<10; i++) printf("%d ", a[i]); }
2.選擇排序法
假設有n個數需要按從小到大排序,選擇排序法的原理是:選擇排序在我看來只是冒泡循環的優化方法,思路是在這n個數中先找到最大的數,並記錄其下標,然后將最大的數與第n個數交換值(如果正好第n個數是最大的就不用交換了),然后再在剩下的n-1個數中,找最大的數,和第n-1個數交換值...以此類推,和冒泡排序不同的是,每一次的內循環中不會不斷的交換值來浪費時間,內循環只是判斷尋找最大值的下標,執行一次外循環才有可能有復制交換值的動作,所以大大減少了復雜度.注意:選擇排序中內循環的變量范圍與冒泡排序不同,冒泡排序因為有[i+1],是選相鄰的兩個比較,也就是從0比到n-1,而選擇排序是假定第0個元素是最大的,碰到比他大的就更新maxindex,也就是從1比到n.但總次數是相同的.
選擇最大值的思路是,假定第0個元素是最大的,如果碰到比它大的就更新maxindex.注意:每次內循環之前,別忘了將maxindex歸零.
#include <stdio.h>
void main()
{
int a[10] = { 5,1,6,9,8,3,4,6,10,7 };
int maxindex = 0, temp;
for (int j = 9; j > 0; j--)
{
maxindex = 0;
for (int i = 1; i <= j; i++)
{
if (a[maxindex] < a[i])
{
maxindex = i;
}
}
if (maxindex!=j)
{
temp = a[maxindex];
a[maxindex] = a[j];
a[j] = temp;
}
}
for (int i = 0; i<10; i++)
printf("%d ", a[i]);
}
3.插入排序法