基礎排序算法之——選擇排序,插入排序,快速排序

選擇排序:

假設長度爲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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章