1、 冒泡排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數。算法思想簡單描述:
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。下面是一種改進的冒泡算法,它記錄了每一遍掃描後最後下沉數的位置k,這樣可以減少外層循環掃描的次數。
冒泡排序是穩定的,算法時間複雜度O(n2)。
程序如下:
void bubble_sort(int*x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循環到沒有比較範圍*/
{
for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交換*/
k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/
}//if
}//for
}//for
}//bubble_sort
也可以是如下格式:
void BubbleSort(inta[],int n)
{
int i,j;
int change;
int temp;
for(i=n-1,change=TURE;i>=1&&change;i--)
{
change=FLASE;
for(j=1;j<=i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
change=TURE;
}//if
}//for
}//BubbleSort
排序過程中沒有進行過交換記錄的操作。如圖中見,小的數往上漂浮,大的數往小沉。
2、 選擇排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
算法思想簡單描述:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。選擇排序是不穩定的。算法複雜度O(n2).
程序如下:
void select_sort(int*x, int n)
{
int i, j, min, t;
for (i=0; i<n-1; i++) /*要選擇的次數:0~n-2共n-1次*/
{
min = i; /*假設當前下標爲i的數最小,比較後再調整*/
for (j=i+1; j<n; j++)/*循環找出最小的數的下標是哪個*/
{
if (*(x+j) < *(x+min))
{
min = j; /*如果後面的數比前面的小,則記下它的下標*/
}//if
} //for
if (min != i) /*如果min在循環中改變了,就需要交換數據*/
{
t = *(x+i);
*(x+i) = *(x+min);
*(x+min) = t;
}//if
}//for
}//select_sort