線性時間排序演算法

2021-09-05 23:45:44 字數 1756 閱讀 3201

基於比較的演算法的時間下限為nlogn,而計數排序、桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下(詳細見《演算法導論》):

#define

no_cmp_sort

#ifdef no_cmp_sort

#define

n    10

#define

bucket_size    10

#define

radix_sort

#ifdef count_sort

intcount_sort(

int*

a, int

*b, 

intn, 

intk)

free(c);

return0;

}#endif

#ifdef  bucket_sort

typedef 

struct

node

node;

intcmp(

const

void*a,

const

void*b)

//桶排序

void

bucketsort(

int*

a, int

n, int

k)end =1

;for

(i =

0; i 

<=

bucket_size; i++)

qsort(a

+start, end

-start, 

sizeof

(a[0

]), cmp);}}

#endif

#ifdef radix_sort

#define

n_field    2

typedef 

struct

user_data

user_data;

typedef 

struct

node

node;

void

bucketsort(user_data

*a, 

intn, 

intk, 

intfld_id)

for(i =j 

=0; i 

<=

bucket_size; i++)

}    }//

基數排序

void

radixsort(user_data

*a, 

intn, 

intk)

#endif

//radix_sort

#endif

//no_cmp_sort

intmain()

printf(

"before radix sort:\n");

for(i =1

; i 

<=

n; i++)

radixsort(a, n, k);

printf(

"\nafter radix sort:\n");

for(i =1

; i 

<=

n; i++)

#endif

//radix_sort

#endif

//no_cmp_sort

return0;

}

出處:

線性時間排序演算法

基於比較的演算法的時間下限為nlogn,而計數排序 桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下 詳細見 演算法導論 define no cmp sort ifdef no cmp...

線性時間排序演算法

繼續上一次的排序演算法的總結,今天帶來的是線性時間排序演算法 可以看到,我們之前的交換演算法時間複雜度最少也只是o nlogn 那麼有沒有o n 的時間複雜度的演算法呢,也是有的,就是線性時間排序演算法。常見的線性時間演算法有 計數排序,基數排序和桶排序,而基數排序和桶排序十分類似,這裡只介紹更為普...

排序演算法 4 線性時間排序

在前面三節排序演算法中,我們分別分析了不同策略,思想用於排序,而這些演算法都是基於資料間的比較來確定順序的。假設我不用比較,換一種思路,那麼就可以達到時間複雜度為o n 的排序演算法,當然是以付出額外的空間為代價的。線性時間排序的演算法思想 1 在計數排序中,利用比x小或等的元素個數和的來確定x位置...