冒泡排序
方法:
第一次先從第一個數據開始,比較相鄰的元素,如果第一個比第二個大(或者小)就交換他們兩個, 一直比較到最後一個數,此時找到了一個最大(或者最小的)的數。
然後第二次和第一次方法一樣,但是比第一次少比較一個數,以後每次比前一次比較數少一;然後一直到第n-1組。
需要對比的次數爲n-1次,每次需要對比的數爲n-1-i個,中間通過x來交換兩值的位置。
代碼:
int x;
for (int i = 0; i < n- 1; i++) //比較n-1次
{
for (int j = 0; j <n-1-i; j++) //還有n-i個數未必比較
{
if (a[j]>a[j + 1])
{ //將兩個數交換位置
x = a[j + 1];
a[j + 1] = a[j];
a[j] = x;
}
}
}
圖解
插入排序
方法:
每次將無序的數列中第一個元素與有序數列的元素從後到前依次比較,找到插入位置,將該元素插入到合適的地方。
先用x儲存將要插入的值的大小,然後用while循環來在有序數列中找到合適的位置,若大於則x,則往後移動一位,最後找到合適的位置,再將x賦值到該位置。
代碼:
int x;
for (int i = 1; i < 10; i++)
{
x = a[i];
int j = i;
while (a[j - 1] > x)
{
a[j] = a[j - 1];
j--;
}
a[j] = x;
}
圖解:
選擇排序
方法:
第一次從所有的元素中選出最小(或最大)的一個元素,然後存放在序列的起始位置;再從剩餘的無序元素中尋找到最小(大)元素,然後放到第二位。以此類推。
下面用x來存放本次最大(或最小的值),xx來存放該值的位置,等全部比較完後再通過y值交換兩值。
代碼:
int x, y,xx;
for (int i = 0; i < n-1; i++)
{
x = a[i];
xx = i;
for (int j = i; j < n; j++)
{
if (x>a[j])
{
x = a[j];
xx = j;
}
}
y = a[i];
a[i] = x;
a[xx] = y;
}
圖解
希爾排序
方法:
先把元素按一定的間隔分組,然後對每組使用插入排序算法排序;然後隨着間隔逐漸減少,每組都逐漸變得有序,混亂度減小,當增量減至1時,整個文件恰被分成一組,算法便終止。
注意:代碼進行插入排序時,增量變爲間隔i,而不再是之前的自增k++,自減k--。此時爲k+=i,k-=i。
代碼:
for (int i = 10 / 2; i > 0; i = i / 2) //每次的間隔i
{
for (int j = 0; j < i; j++) //分爲i組,分組比較
{
int x;
for (int k = j + i; k < 10;) //每組進行插入排序
{
x = a[k];
int m = k;
while (a[m - i] > x)
{
a[m] = a[m - i];
m -= i;
}
a[m] = x;
k += i;
}
}
}