Đề cương môn Cấu trúc dữ liệu và giải thuật HV CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG chuyên nghành công nghệ thông tin, tài liệu môn cấu trúc dữ liệu giải thuật, giáo trình môn cấu trúc dữ liệu giải thuật, giáo trình ôn tập môn cấu trúc dữ liệu giải thuật.
Cấu trúc liệu giải thuật I Sắp sếp tìm kiếm 1: Sắp xếp • xếp chọn(selection sort) A: Thuật toán selection sort void selection_sort(){ int i, j, k, temp; for (i = 0; i< N; i++){ k = i; for (j = i+1; j < N; j++){ if (a[j] < a[k]) k = j; } temp = a[i]; a[i] =a [k]; a[k] = temp; } } B Độ phức tạp Cmin=Cmax=Ctb=n(n-1)/2 Tốt nhất: nlogn C: Ví dụ, bước thực xếp chọn dãy số bên sau: Cho dãy số K={5, 6, 9, 1, 3, 4, 2, 7, 8} bước 1: bước 2: bước 3: bước 4: bước 5: bước 6: bước 7: bước 8: b1 b2 b3 b4 b5 b6 b7 b8 b9 18 10 12 12 11 15 15 15 12 10 18 18 18 12 19 19 19 19 19 13 11 11 12 15 15 15 15 17 17 17 17 17 17 17 16 13 13 13 13 13 19 19 19 17 12 12 12 12 18 18 18 18 18 18 16 16 16 16 16 16 16 17 19 19 • Sắp xếp chèn (Insert sort) A: Thuật toán void insertion_sort(){ int i, j, k, temp; for (i = 1; i< N; i++){ temp = a[i]; j=i-1; while ((a[j] > temp)&&(j>=0)) { a[j+1]=a[j]; j ; } a[j+1]=temp; } } B: Độ phức tạp độ phức tạp bé nhất: Cmin=(n-1) độ phức tạp lớn nhất: n(n-1)/2=O(n2) độ phức tạp trung bình: (n2+n-2)/4=O(n2) Nlogn C: Ví dụ Cho dãy K={4 2} bước 1: bước 2: 2 bước 3: bước 4: bước 5: bước 6: bước 7: bước 8: 18 12 15 10 19 11 17 13 b1 12 18 b2 12 15 18 b3 10 12 15 18 b4 10 12 15 18 19 b5 10 11 12 15 18 19 b6 10 11 12 15 17 18 19 b7 10 11 12 13 15 17 18 19 b8 b9 10 10 11 11 12 12 12 12 13 13 15 15 17 16 18 17 • Sắp xếp nhanh( Quich sort) A: Thuật toán void quick(int left, int right) { int i,j; int x,y; i=left; j=right; x= a[left]; { while(a[i]left) j ; if(i > bk, duyệt theo trình tự từ điển ngược Chẳng hạn với n = 7, có thứ tự từ điển ngược cách phân chia sau: 5 4 1 3 2 1 1 2 2 1 1 1 1 1 1 1 1 Như vậy, cách chia n Cách chia cuối dãy n số Bây cần xây dựng thuật toán sinh cho cách phân chia chưa phải cuối Thuật toán sinh cách phân chia kế tiếp: void Next_Division(void){ int i, j, R, S, D; i = k; while(i>0 && C[i]==1) i ; if(i>0){ C[i] = C[i]-1; D = k - i +1; R = D / C[i]; S = D % C[i]; 44 k = i; if(R>0){ for(j=i+1; j0){ k=k+1; C[k] = S; } } else Stop=TRUE; } Văn chương trình thể sau: #include #include #include #define MAX 100 #define TRUE #define FALSE int n, C[MAX], k, count, Stop; void Init(void){ printf("\n Nhap n="); scanf("%d", &n); k=1;count=0; C[k]=n; } void Result(void){ int i; count++; printf("\n Cach chia %d:", count); for(i=1; i0 && C[i]==1) i ; if(i>0){ C[i] = C[i]-1; D = k - i +1; R = D / C[i]; S = D % C[i]; k = i; if(R>0){ for(j=i+1; j0){ k=k+1; C[k] = S; } } else Stop=TRUE; } void Division(void){ Stop = FALSE; while (!Stop){ Result(); Next_Division(); } 46 } void main(void){ clrscr(); Init(); Division(); getch(); } Thuật toán quay lui ( Back stack) Ví dụ Liệt kê xâu nhị phân độ dài n Biểu diễn xâu nhị phân dạng b 1, b2, , bn, bi∈{0, } Thủ tục đệ qui Try(i) xác định bi với giá trị đề cử cho b i Các giá trị mặc nhiên chấp nhận mà không cần phải thoả mãn điều kiện (do tốn khơng cần đến biến trạng thái) Thủ tục Init khởi tạo giá trị n biến đếm count Thủ tục kết in dãy nhị phân tìm Chẳng hạn với n =3 , tìm kiếm lời giải thể hình 3.2 Gốc 1 000 001 010 011 100 1 101 110 111 Hình 3.2 Cây tìm kiếm lời giải liệt kê dãy nhị phân độ dài Văn chương trình liệt kê xâu nhị phân có độ dài n sử dụng thuật tốn quay lui thực sau: #include #include #include 47 #include void Result(int *B, int n){ int i; printf("\n "); for(i=1;i