Nhảy chuyển đến

Đếm hết bài tự

Nhắc nhở

Bổn giao diện muốn giới thiệu không phảiSố đếm bài tự.

Bổn giao diện đem giản yếu giới thiệu đếm hết bài tự.

Định nghĩa

Đếm hết bài tự ( tiếng Anh: Counting sort ) là một loại tuyến tính thời gian bài tự thuật toán.

Quá trình

Đếm hết bài tự công tác nguyên lý là sử dụng một cái thêm vào số tổ,Trong đó đệCái nguyên tố là đãi bài tự số tổTrung giá trị tương đươngNguyên tố cái số, sau đó căn cứ số tổTới đemTrung nguyên tố bài đến chính xác vị trí.1

Nó công tác quá trình chia làm ba cái bước đi:

  1. Tính toán mỗi cái số xuất hiện vài lần;
  2. Cầu ra mỗi cái số xuất hiện số lầnTiền tố cùng;
  3. Lợi dụng xuất hiện số lần tiền tố cùng, từ hữu đến tả tính toán mỗi cái số xếp hạng.

Tính toán tiền tố cùng nguyên nhân

Đọc tấu chương nội dung chỉ cần hiểu biết tiền tố cùng khái niệm có thể

Trực tiếp đemCông chính số đối ứng nguyên tố theo thứ tự để vàoTrung không thể giải quyết nguyên tố lặp lại tình hình.

Chúng ta thông qua vì thêm vào số tổTrung mỗi hạng nhất tính toán tiền tố cùng, kết hợp mỗi hạng nhất trị số, liền có thể làm trọng phục nguyên tố xác định một cái duy nhất xếp hạng:

Thêm vào số tổTrung mỗi hạng nhất trị số tức là nên key giá trị hạ lặp lại nguyên tố cái số, mà nên hạng tiền tố cùng tức là xếp hạng cuối cùng một cái lặp lại nguyên tố xếp hạng.

Nếu dựa theoNghịch tự tiến hành sắp hàng, như vậy hiển nhiên bài tự sau số tổ đem bảo trìNguyên tự ( tương đồng key giá trị dưới tình huống ), cũng tức được đến một loại ổn định bài tự thuật toán.

counting sort animate example

Tính chất

Ổn định tính

Đếm hết bài tự là một loại ổn định bài tự thuật toán.

Thời gian phức tạp độ

Đếm hết bài tự thời gian phức tạp độ vì,Trong đóĐại biểu đãi bài tự số liệu giá trị vực lớn nhỏ.

Số hiệu thực hiện

Ngụy số hiệu

1
2
3
4
5
6
7
8
9
10
11
constexprintN=100010;
constexprintW=100010;

intn,w,a[N],cnt[W],b[N];

voidcounting_sort(){
memset(cnt,0,sizeof(cnt));
for(inti=1;in;++i)++cnt[a[i]];
for(inti=1;iw;++i)cnt[i]+=cnt[i-1];
for(inti=n;i>=1;--i)b[cnt[a[i]]--]=a[i];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
N=W=100010
n=w=0
a=b=[0]*N
cnt=[0]*W


defcounting_sort():
foriinrange(1,n+1):
cnt[a[i]]+=1
foriinrange(1,w+1):
cnt[i]+=cnt[i-1]
foriinrange(n,0,-1):
b[cnt[a[i]]-1]=a[i]
cnt[a[i]]-=1

Tham khảo tư liệu cùng chú thích