排序的本質就是消除序列中的逆序對,關于逆序對的介紹參考逆序對,利用貪心的思想,消除相鄰兩個項的逆序對,復雜度為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;
}