combsort.cpp
Bài toán:
Sắp xếp một dãy số theo thứ tự không giảm.
Độ phức tạp:
O(n logn)
Code này của : Nguyễn Tiến Trung Kiên
#include <stdio.h>
int a[230997];
int n;
void combsort(){
int g=n, s=0, j;
while (g>1 or s!=0){
g=g*77/96;
if (g<=1) g=1;
s=0;
for (j=1; j+g<=n; j++)
if (a[j]>a[j+g]){
s=a[j]; a[j]=a[j+g]; a[j+g]=s; // swap a[j], a[j+g]
s=1;
}
}
}
main(){
int i;
scanf("%d", &n);
for (i=1; i<=n; i++) scanf("%d", &a[i]);
combsort();
for (i=1; i<=n; i++)
printf("%d, ", a[i]);
printf("\n");
}
Nhận xét
Rất dễ viết luôn! Hằng số 77/96 bạn có thể thay bằng số nào đó xấp xỉ 3/4.
Trên kia mình dùng biến s để tráo đổi hai biến a[j] và a[j+g]. Bạn có thể dùng cách khác nhưng hãy nhớ gán s = 1 để vòng lặp đưuọc tiếp tục.