Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 51 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
51
Dung lượng
619 KB
Nội dung
z BỘ GIÁO DỤC VÀ ĐÀO TẠO PHÂN HIỆU TRƯỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI TẠI TP.HỒ CHÍ MINH BỘ MÔN CÔNG NGHỆ THÔNG TIN - - Báo cáo tập lớn Lập trình hướng đối tượng Mơ tả thuật tốn xếp giao diện GVHD: Trần Phong Nhã Sinh viên thực : Nguyễn Thanh Toàn Cao Thành Lợi Nguyễn Quốc Hồng Ân TP.Hồ Chí Minh, 11/2016…………………………………… BỘ GIÁO DỤC VÀ ĐÀO TẠO PHÂN HIỆU TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TẠI TP.HỒ CHÍ MINH BỘ MƠN CƠNG NGHỆ THƠNG TIN - - Báo cáo tập lớn Lập trình hướng đối tượng Mơ tả thuật tốn xếp giao diện GVHD: Trần Phong Nhã Sinh viên thực : Nguyễn Thanh Toàn Cao Thành Lợi Nguyễn Quốc Hồng Ân TP.Hồ Chí Minh, 11/2016………………………… LỜI CẢM ƠN Trên thực tế khơng có thành cơng mà khơng gắn liền với hổ trợ , giúp đở dù hay nhiều , dù trực tiếp hay gián tiếp người khác Trong suốt thời gian từ bắt đầu làm tập lớn mơn lập trình hướng đối tượng , chúng em nhận nhiều quan tâm giúp đở quý thầy cô bạn bè Với lòng biết ơn sâu sắc chúng em xin gửi đến q thầy giảng viên khoa công nghệ thông tin trường Đại học Giao thông Vận tải phân hiệu thành phố Hồ Chí Minh nói chung đặc biệt thầy Trần Phong Nhã nói riêng Thầy tận tình truyền đạt kiến thức vơ q báo cho em , giúp em có thêm nguồn kiến thức để hồn thiện tập lớn hồn thành thật tốt Giúp em có kinh nghiệm việc làm tập lớn , báo cáo , củng rèn luyện thêm cho em kỷ cần thiết giảng đường đại học lẩn công việc sau Thời gian làm tập lớn vỏn vẹn ba tuần Đây lần em làm tập lớn không tránh khỏi bỡ ngở nguồn kiến thức em nhiều hạn chế Do thiếu sót điều khơng thể tránh khỏi Em mong nhận góp ý q báo từ thầy bạn để hồn thiện tập lớn lần xa báo cáo tốt nghiệp Một lần em xin chân thành cảm ơn Tp.Hồ Chí Minh, Ngày 11/2016 LỜI NĨI ĐẦU Ngày Công nghệ thông tin phát triển với tốc độ nhanh chóng Cơng nghệ thơng tin ứng dụng nhiều lĩnh vực nghiên cứu khoa học, phát triển kinh tế, quân nhiều loại hình nghệ thuật khác Ở nước tiên tiến, máy tính ứng dụng nhiều lĩnh vực nhằm phục vụ cho lợi ích người Việc liên lạc tìm kiếm thơng tin khơng bị cản trở Mọi người giới gắn kết với nhờ công nghệ thông tin Tất nước có Việt Nam cố gắng tìm cách áp dụng thành tựu Cơng nghệ thơng tin vào việc phát triển kinh tế- xã hội Ở nước ta có nhiều ứng dụng áp dụng ngồi thực tiển , thuật tốn xếp thuật toán quan trọng kiến thức thiếu khoa học máy tính ứng dụng nhiều lập trình,chính em chọn đề tài mơ lại thuật toán xếp cách sử dụng giao diện Mặc dù cố gắng để hoàn thành tốt tập lớn , thời gian có hạn thiết kinh nghiệm kỹ thuật nhiều thiếu sót hạn chế nên việc phân tích thiết kế nhiều thiếu sót, em mong nhận góp ý quý báo thầy bạn để em hoàn thiện cho tập lớn tốt Em xin chân thành cảm ơn! Tp.Hồ Chí Minh, Ngày 18/11/2016 MỤC LỤC I Lời Nói Đầu II Lời Cảm Ơn III Nội Dung Báo cáo MỤC LỤC .5 3.1.3 Cài đặt code C/C++ Nội Dung Báo Cáo 1.Thuật toán 1.1 Khái niệm thuật toán Thuật toán dãy hữu hạn thao tác xếp theo trình tựxác định cho sau thực dãy thao tác ấy, từInput tốn ta nhận Output cần tìm Cũng xem thuật tốn cơng cụ để giải toán cụ thể Phát biểu toán định tổng quát mối quan hệ Input/Output cần thiết Thuật tốn mơ tảmột thủtục tính tốn cụ thể để đạt mối quan hệ Input/Output 2.Tổng quan thuật toán xếp 2.1Giới thiệu thuật tốn xếp Trong khoa học máy tính toán học, thuật toán xếp thuật toán xếp phần tử danh sách (hoặc mảng) theo thứ tự tăng (hoặc giảm) Người ta thường xét trường hợp phần tử cần xếp số Sắp xếp trình xử lý danh sách phần tử (hoặc mẫu tin) để đặt chúng theo thứ tự thỏa mãn tiêu chuẩn dựa nội dung thơng tin lưu giữ phần tử Mức độ hiệu giải thuật phụ thuộc vào tính chất cấu trúc liệu cụ thể mà tác động đến Có nhiều giải thuật xếp: Selection sort, Insertion sort, Interchange sort, Bubble sort, Shaker sort, Binary Insertion sort, Shell sort, Heap sort, Quick sort, Merge sort, Radix sort… 2.2 Sơ lược số thuật toán xếp Có nhiều giải thuật xếp: Selection sort, Insertion sort, Interchange sort, Bubble sort, Shaker sort, Binary Insertion sort, Shell sort, Heap sort, Quick sort, Merge sort, Radix sort… Nhưng chúng em chĩ vận dụng số giải thuật xếp vào tập lớn sau sơ lược giải thuật xếp đó: 2.2.1 Thuật toán xếp bọt (Bubble Sort) Là thuật toán xếp đơn giản, với thao tác so sánh hai phần tử kề nhau, chúng chưa đứng thứ tự đổi chỗ (swap) Có thể tiến hành từ xuống (bên trái sang) từ lên (bên phải sang) Sắp xếp bọt có tên xếp so sánh trực tiếp Nó sử dụng phép so sánh phần tử nên giải thuật xếp kiểu so sánh 2.2.2 Thuật toán xếp chèn (Insert-Sort) Là thuật toán xếp bắt chước cách xếp quân người chơi Muốn theo trật tự người chơi rút từ quân thứ 2, so với quân đứng trước để chèn vào vị trí thích hợp 2.2.3 Thuật toán xếp chọn (Selection-Sort) Là Chọn phần tử nhỏ n phần tử ban đầu, đưa phần tử vị trí dãy hành Sau khơng quan tâm đến nữa, xem dãy hành n-1 phần tử dãy ban đầu, vị trí thứ Lặp lại trình cho dãy hành đến dãy hành phần tử Dãy ban đầu có n phần tử, tóm tắt ý tưởng thuật toán thực n-1 lượt việc đưa phần tử nhỏ dãy hành vị trí đầu dãy 2.2.4 Thuật tốn xếp trộn (Merge-Sort) Là thuật toán xếp để xếp danh sách (hoặc cấu trúc liệu truy cập tuần tự, v.d luồng tập tin) theo trật tự Nó xếp vào thể loại xếp so sánh Thuật toán ví dụ tương đối điển hình lối thuật toán chia để trị doJohn von Neumann đưa lần đầu năm 1945[1] Một thuật toán chi tiết Goldstine Neumann đưa năm 1948.[2] 2.2.5 Thuật toán xếp nhanh (Quick-Sort) Là xếp kiểu phân chia (part sort) thuật toán xếp phát triển C.A.R Hoarec thành hai danh sách Khác với xếp trộn, chia danh sách cần xếp thành hai danh sách có kích thước tương đối nhờ số đứng danh sách, xếp nhanh chia thành hai danh sách cách so sánh phần tử danh sách với phần tử chọn gọi phần tử chốt Những phần tử nhỏ phần tử chốt đưa phía trước nằm danh sách thứ nhất, phần tử lớn chốt đưa phía sau thuộc danh sách đứng sau Cứ tiếp tục chia tới danh sách có độ dài 2.2.6 Thuật toán vun đống (Heap Sort) Sắp xếp vun đống (Heapsort) dựa cấu trúc liệu gọi đống nhị phân (binary heap), gọi đơn giản đống 2.3 Một số hình ảnh minh họa thuật toán xếp H1.Minh họa thuật toán xếp trộn H2.Minh họa thuật toán xếp bọt H3.Minh họa thuật toán xếp chọn H4.Minh họa thuật toán xếp vun đống this->btn_sapxep->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(0)), static_cast(static_cast(0)), static_cast(static_cast(192))); this->btn_sapxep->Location = System::Drawing::Point(519, 87); this->btn_sapxep->Name = L"btn_sapxep"; this->btn_sapxep->Size = System::Drawing::Size(84, 26); this->btn_sapxep->TabIndex = 6; this->btn_sapxep->Text = L"Sắp Xếp"; this->btn_sapxep->UseVisualStyleBackColor = true; this->btn_sapxep->Click += gcnew System::EventHandler(this, &MyForm::btn_sapxep_Click); // // btn_inday // this->btn_inday->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(192)), static_cast(static_cast(255)), static_cast(static_cast(255))); this->btn_inday->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(0)), static_cast(static_cast(0)), static_cast(static_cast(192))); this->btn_inday->Location = System::Drawing::Point(621, 87); this->btn_inday->Name = L"btn_inday"; this->btn_inday->Size = System::Drawing::Size(75, 26); this->btn_inday->TabIndex = 7; this->btn_inday->Text = L"In Dãy"; this->btn_inday->UseVisualStyleBackColor = true; this->btn_inday->Click += gcnew System::EventHandler(this, &MyForm::btn_inday_Click); // 31 // btn_xoa // this->btn_xoa->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(192)), static_cast(static_cast(255)), static_cast(static_cast(255))); this->btn_xoa->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(0)), static_cast(static_cast(0)), static_cast(static_cast(192))); this->btn_xoa->Location = System::Drawing::Point(519, 125); this->btn_xoa->Name = L"btn_xoa"; this->btn_xoa->Size = System::Drawing::Size(84, 27); this->btn_xoa->TabIndex = 8; this->btn_xoa->Text = L"Xóa Dãy"; this->btn_xoa->UseVisualStyleBackColor = true; this->btn_xoa->Click += gcnew System::EventHandler(this, &MyForm::btn_xoa_Click); // // btn_thoat // this->btn_thoat->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(192)), static_cast(static_cast(255)), static_cast(static_cast(255))); this->btn_thoat->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(0)), static_cast(static_cast(0)), static_cast(static_cast(192))); this->btn_thoat->Location = System::Drawing::Point(621, 125); this->btn_thoat->Name = L"btn_thoat"; this->btn_thoat->Size = System::Drawing::Size(75, 27); 32 this->btn_thoat->TabIndex = 9; this->btn_thoat->Text = L"Thoát"; this->btn_thoat->UseVisualStyleBackColor = true; // // ric_ketqua // this->ric_ketqua->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(255)), static_cast(static_cast(192)), static_cast(static_cast(255))); this->ric_ketqua->Location = System::Drawing::Point(355, 181); this->ric_ketqua->Name = L"ric_ketqua"; this->ric_ketqua->Size = System::Drawing::Size(195, 139); this->ric_ketqua->TabIndex = 10; this->ric_ketqua->Text = L""; // // label1 // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(280, 222); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(49, 13); this->label1->TabIndex = 11; this->label1->Text = L"Kết Quả:"; // // btn_nhap // this->btn_nhap->AccessibleDescription = L""; this->btn_nhap->AccessibleName = L""; this->btn_nhap->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 8.25F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 33 static_cast(0))); this->btn_nhap->ForeColor = System::Drawing::Color::Purple; this->btn_nhap->Location = System::Drawing::Point(274, 67); this->btn_nhap->Name = L"btn_nhap"; this->btn_nhap->Size = System::Drawing::Size(79, 23); this->btn_nhap->TabIndex = 12; this->btn_nhap->Text = L"Lấy Số"; this->btn_nhap->UseVisualStyleBackColor = false; this->btn_nhap->Click += gcnew System::EventHandler(this, &MyForm::btn_nhap_Click); // // MyForm // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(192)), static_cast(static_cast(255)), static_cast(static_cast(255))); this->ClientSize = System::Drawing::Size(739, 332); this->Controls->Add(this->btn_nhap); this->Controls->Add(this->label1); this->Controls->Add(this->ric_ketqua); this->Controls->Add(this->btn_thoat); this->Controls->Add(this->btn_xoa); this->Controls->Add(this->btn_inday); this->Controls->Add(this->btn_sapxep); this->Controls->Add(this->nutlenh); this->Controls->Add(this->label3); this->Controls->Add(this->rad_sapxepnhanh); this->Controls->Add(this->rad_sapxepvundong); this->Controls->Add(this->rad_sapxeptron); 34 this->Controls->Add(this->rad_sapxepnoibot); this->Controls->Add(this->rad_sapxepchon); this->Controls->Add(this->rad_sapxepchen); this->Controls->Add(this->txt_nhap); this->Controls->Add(this->label2); this->Controls->Add(this->Main); this->Name = L"MyForm"; this->Text = L"MyForm"; this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion //Bắt Đầu Viêt code void LTHDT::MyForm::swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } //Insertionsort void LTHDT::MyForm::Insertionsort() { this->ric_ketqua->Text += "\n Sap xep theo Insertion sort: \n\r"; for (int i = 1; i < n; i++) { for (int j = i; j > 0; j ) if (p[j] < p[j - 1]) { 35 swap(&p[j], &p[j - 1]); // in bước thực thuật toán for (int i = 0; i < n; i++) this->ric_ketqua->Text += p[i] + " "; this->ric_ketqua->Text += "\n"; } } } //Selectionsort void LTHDT::MyForm::Selectionsort() { int min; this->ric_ketqua->Text += "\n Sap xep theo Selection sort: \n\r"; for (int i = 0; i < n - 1; i++) { = i; for (int j = i + 1; j < n; j++) { if (p[j] < p[min]) = j; } if (min != i) { swap(&p[i], &p[min]); // in bước thực thuật toán for (int i = 0; i < n; i++) this->ric_ketqua->Text += p[i] + " "; this->ric_ketqua->Text += "\n"; } } } 36 //Bubblesort void LTHDT::MyForm::Bubblesort() { this->ric_ketqua->Text +="\n Sap xep theo Bubblesort: \n\r"; for (int i = 0; ip[j]) { swap(&p[i], &p[j]); // in bước thực thuật toán for (int i = 0; i < n; i++) { this->ric_ketqua->Text += p[i] + " "; } this->ric_ketqua->Text += "\n"; } } } //Heapsort: Bước1 void LTHDT::MyForm::Heapify(int *p, int n, int i) { int Left = * (i + 1) - 1; int Right = * (i + 1); int Largest; if (Leftp[i]) Largest = Left; else Largest = i; if (Rightp[Largest]) Largest = Right; if (i != Largest) { swap(&p[i], &p[Largest]); Heapify(p, n, Largest); 37 } } //heapsort: Bước void LTHDT::MyForm::BuidHeap(int *p, int n) { for (int i = (n / 2) - 1; i >= 0; i ) Heapify(p, n, i); } //Hoàn thành Heapsort void LTHDT::MyForm::Heapsort() { this->ric_ketqua->Text += "\n Sap xep theo Heap sort: \n\r"; BuidHeap(p, n); for (int i = n - 1; i > 0; i ) { swap(&p[0], &p[i]); // in bước thực thuật toán for (int i = 0; iric_ketqua->Text += p[i] + " "; this->ric_ketqua->Text += "\n"; Heapify(p, i, 0); } } //Mergesort: Bước void LTHDT::MyForm::Merger(int *p, int start, int end) { int mid = (start + end) / 2; int i = start; int j = mid + 1; int temp; while (i i; k ) p[k] = p[k - 1]; p[i] = temp; j++; } i++; } } //Mergersort: Bước int LTHDT::MyForm::Merger(int *p, int start, int end, int n) { if (end - start < 1) return 0; int mid = (start + end) / 2; // in bước thực thuật toán for (int i = 0; iric_ketqua->Text += p[i] + " "; this->ric_ketqua->Text += "\n"; Merger(p, start, mid); Merger(p, mid + 1, end); Merger(p, start, end); } //Hoàn thành Mergersort void LTHDT::MyForm::Mergert() { int *p; int n; this->ric_ketqua->Text += "\n Sap xep theo Merger sort: \n\r"; Merger(p, 0, n - 1); for (int i = 0; iric_ketqua->Text += p[i] + " "; } // Quicksort: Bước 39 int LTHDT::MyForm::Quicksort(int *p, int left, int right) { int pivot = p[left]; int i = left + 1; int j = right; { while (i Text += "\n Sap xep theo Quick sort: \n\r"; Quicksort(p, 0, n - 1); } private: System::Void btn_nhap_Click(System::Object^ sender, System::EventArgs^ e) { try { p[n] = Convert::ToInt32(this->txt_nhap->Text); n++; this->txt_nhap->ResetText(); this->txt_nhap->Focus(); } catch (Exception^ex) { MessageBox::Show(" Ban hay nhap vao tung so nguyen y! \n\r < 10 ki tu \n\r nhap toi da 100 phan tu "); this->txt_nhap->Clear(); } } //in đưa bảng Kết private: System::Void btn_inday_Click(System::Object^ sender, System::EventArgs^ e) { if (n == 0) { this->ric_ketqua->Text = ("Chua co mang"); } else { this->ric_ketqua->Text += ("Cac phan tu mang: \r\n"); 41 for (int i = 0; i < n; i++) { this->ric_ketqua->Text += p[i] + " "; } } } private: System::Void txt_nhap_TextChanged(System::Object^ sender, System::EventArgs^ e) { } private: System::Void btn_xoa_Click(System::Object^ sender, System::EventArgs^ e) { this->ric_ketqua->Text = " "; n = 0; this->txt_nhap->Focus(); } // xếp private: System::Void btn_sapxep_Click(System::Object^ sender, System::EventArgs^ e) { if (n == 0) { this->ric_ketqua->Text = "Mang chua co gia tri nen khong the sap xep! "; } else if (n == || n == 2) { this->ric_ketqua->Text += "\n Mang ban nhap khong hop le! "; } else if (rad_sapxepchen->Checked == true) { Insertionsort(); } else if (rad_sapxepchon->Checked == true) { Selectionsort(); } 42 else if (rad_sapxepnoibot->Checked == true) { Bubblesort(); } else if (rad_sapxepvundong->Checked == true) { Heapsort(); } else if (rad_sapxeptron->Checked == true) { Mergert(); } else if (rad_sapxepnhanh->Checked == true) { Quicksort(); } } private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) { } }; Ứng dụng thuật toán xếp Ứng dụng xếp có khắp nơi: -Một danh sách lớp với học sinh xếp theo thứ tự bảng chữ -Một danh bạ điện thoại -Danh sách truy vấn tìm kiếm nhiều Google Thuật toán xếp dùng kết hợp với thuật tốn khác, tìm kiếm nhị phân, thuật tốn Kruskal để tìm khung nhỏ đồ thị 43 Tài liệu tham khảo [1] http://vlo.vn/t/thuat-toan-sap-xep-nhanh/ [2] http://windybook.com/thuat-toan-thuat-toan-sap-xep-phan-4/ [3] Lập trình Hướng Đối Tượng C++ - Phạm Văn Ất(Chủ biên) –Nguyễn Hiếu Cường [4] http://vnoi.info/wiki/algo/basic/sorting 44 45 ... Chí Minh, Ngày 18 /11 /2 016 MỤC LỤC I Lời Nói Đầu II Lời Cảm Ơn III Nội Dung Báo cáo MỤC LỤC .5 3 .1. 3 Cài đặt code C/C++ Nội Dung Báo Cáo 1. Thuật toán 1. 1 Khái niệm thuật... 3.2 .1 Ý tưởng: Giả sử có sẵn đoạn X[0], X [1] , X[2],…., X[n] xếp không giảm Trong trường hợp coi dãy có phần từ X [1] xếp Xét phần từ X[i +1] , tìm cách chèn vào vị trí X [1] ,…,X[i] để dãy X1,…,X[i +1] ... Bước 1: i = 1; //giả sử đoạn Array [1] xếp Bước 2: Key = Array[i]; tìm vị trí pos thích hợp đoạn Array [1] đến Array[i1] để chèn Array[i] vào Bước 3: Dời chỗ phần tử Array[pos] đến Array[i -1] sang