基於比較的演算法的時間下限為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位置...