基于貪心策略的排序算法

排序的本質就是消除序列中的逆序對,關于逆序對的介紹參考逆序對,利用貪心的思想,消除相鄰兩個項的逆序對,復雜度為O(n^2),代碼如下:

void greedy_sort(int a[],int n = 10){
    for(int i = 1;i < n;){
        if(i < 1 || a[i-1] <= a[i])
            i++;
        else{
            swap(a[i-1],a[i]); i--;
        }
    }
}

改進版

記錄下最右側逆序對位置記錄,復雜度仍舊為O(n^2),但極大減少光標移動數(shù),優(yōu)化了接近一半。
代碼如下:

void greedy_sort(int a[],int n = 10){
    int flag = 1 ;//跳轉的標記;
    for(int i = 1;i < n;){
        flag = i;
        while(a[i] < a[i-1] && 0 < i){
            swap(a[i],a[i-1]);
            i--;
        }
            i = flag;
            i++;
            flag = i;
    }
}

完整代碼:

#include "iostream"
using namespace std;

int a[] = {10,5,17,65,21,48,10,35,85,45};

void swap(int & x,int & b){ //引用變量
    int temp;
    temp = x;
    x = b;
    b = temp;
}


void greedy_sort(int a[],int n = 10){
    for(int i = 1;i < n;){
        if(i < 1 || a[i-1] <= a[i])
            i++;
        else{
            swap(a[i-1],a[i]); i--;
        }
    }
}
void greedy_sort1(int a[],int n = 10){
    int flag = 1 ;//跳轉的標記;
    for(int i = 1;i < n;){
        flag = i;
        while(a[i] < a[i-1] && 0 < i){
            swap(a[i],a[i-1]);
            i--;
        }
            i = flag;
            i++;
            flag = i;
    }
}

int main(int argc, char const *argv[])
{
    greedy_sort(a);
    i = 0;
    while(i < 10){
        cout<<a[i]<<" ";
        i++;
    }
    return 0;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容