選擇排序:
假設長度爲n的數組arr,要按照從小到大排序,那麼先從n個數字中找到最小值min1,如果最小值min1的位置不在數組最左端(也就是min1不等於arr[0]),則將最小值min1和arr[0]交換,接着在剩下的n-1個數字中找到最小值min2,如果最小值min2不等於arr[1],則交換這兩個數字,以此類推,直到有序,時間複雜度O(n^2)。
代碼如下:
void select_sort(int arr[], int length)
{
int i,j;
for(i=0; i<length; i++)
{
int index = i;
for(j=i+1; j<length; j++)
{
if(arr[j] < arr[index])
index = j;
}
if(index == i)
continue;
else
{
int temp;
temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
}
插入排序:
插入排序,即把數組中的一個元素取出來(從第二個元素開始取,因爲第一個元素自然有序),與數組中的其他元素進行比較,大於被取出元素者後移,小於等於被取出元素者或者前面已經沒有元素了,插入其後,時間複雜度O(n^2)
void sort(int *a,int n)
{
int i,j,tmp;
for(i=1;i<n;i++){
//取出要插入的元素
tmp = a[i];
//大於被取出元素者後移,小於等於被取出元素者或者前面已經沒有元素了,插入其後
for(j=i;j>0&&a[j-1]>tmp;j--){
a[j] = a[j-1];
}
a[j] = tmp;
}
}
快速排序:
找到一個基準(一般是數組第一個或者最後一個),然後從數組最後一個元素(j)開始找到比基準小的數,放到基準的左邊,然後從數組第一個元素(i)開始找到比基準大的數,放到基準的右邊,以此類推,直到 i=j,然後遞歸調用,直到數組有序。
void quick_sort(int s[], int l,int h)
{
if(l < h)
{
int i = l,j = h,base = s[l];
while(i < j)
{
while(i < j && s[j] >= base) //從右往左找到一個小於base的數
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] <= base) //從左往右找到一個大於base的數
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = base; //i = j 的時候,將base填入i與j相同的位置
quick_sort(s, l, i-1); //遞歸調用,實現左右兩邊的排序
quick_sort(s,i+1, h);
}
}