Transcript
Page 1: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

BÁO CÁO THỰC TẬP CƠ SỞ

ĐỀ TÀI: TÌM HIỂU MỘT SỐ THUẬT TOÁN

SẮP XẾP

Sinh viên thực hiện: Trần Đình Nguyên

Giáo viên hướng dẫn: Vũ Thị Thúy Thảo

Page 2: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Một số kiến thức cơ bản.

Một số thuật toán sắp xếp.

Tìm hiểu ngôn ngữ Java.

Demo chương trình.

1.Nội dung chính

Page 3: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Thuật toán:Khái niệm thuật toán sắp xếp:

Thuật toán là một tập hữu hạn các chỉ thị

hay phương cách được định nghĩa rõ ràng cho

việc hoàn tất một sự việc từ một trạng thái

ban đầu cho trước; khi các chỉ thị này được

áp dụng triệt để thì sẽ dẩn đến kết quả sau

cùng như đã dự đoán.

2.Một số kiến thức cơ bản

Page 4: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Khái niệm thuật toán sắp xếp.• Sắp xếp (sort) là một quá trình biến

đổi một danh sách các đối tượng

thành một danh sách thỏa mãn một

thứ tự xác định nào đó.

Page 5: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.1. Sắp xếp chọn(Selection Sort)3.1.1. Tư tưởngĐầu tiên chọn phần tử có khóa nhỏ nhất

trong n phần tử a[1] đến a[n] và hoán vị với phần tử a[1].

Chọn phần tử có khóa nhỏ nhất trong n-1 phần tử từ a[2] đến a[n] và hoán vị nó với a[2]…

Ở bước i, chọn phần tử có khóa nhỏ nhất trong n-i+1 phần tử từ a[i] đến a[n] và hoán vị nó với a[i].

Sau n-1 bước thì ta thu được mảng đã được sắp xếp.

3.Một số thuật toán sắp xếp

Page 6: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.1.2. Thuật toánProcedure SelectionSort;Var I,j,k: integer;min: Real;Beginfor i:=1 to n-1 doBegink:=1; min:= a[i];for j:=i+1 to n doIf a[j]<min then Begin min:= a[j]; k:=j; End;Swap(a[i],a[k]); End;End;

Page 7: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.1.3. Độ phức tạp của thuật toán T(n)=O(n2)

3.1.4. Ví dụBan đầu: 5 6 2 2 10 12 9 10 9 3

Bước 1: 2| 6 5 2 10 12 9 10 9 3

Bước 2: 2 2| 5 6 10 12 9 10 9 3

Bước 3: 2 2 3| 6 10 12 9 10 9 5

Bước 4: 2 2 3 5| 10 12 9 10 9 6

Bước 5: 2 2 3 5 6| 12 9 10 9 10

Bước 6: 2 2 3 5 6 9| 12 10 9 10

Bước 7: 2 2 3 5 6 9 9| 10 12 10

Bước 8: 2 2 3 5 6 9 9 10| 12 10

Bước 9: 2 2 3 5 6 9 9 10 10 12

Page 8: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.2. Sắp xếp chèn(Insretion Sort).3.2.1. Tư tưởngLấy dần từng phần tử từ dãy nguồn, chèn vào dãy

đích sao cho đảm bảo dãy đích có thứ tự.

Bước 1: Chèn phần tử a[2] vào danh sách đã có thứ

tự a[1] sao cho a[1], a[2] là một danh sách có thứ tự.

Bước i: Chèn phần tử a[i+1] vào danh sách đã có thứ

tự a[1], a[2],…a[i] sao cho a[1], a[2], …a[i+1] là một

danh sách có thứ tự.

Page 9: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.2. Thuật toánProcedure InsertionSort;Var i,j: Integer;Begin

For i:=2 to n doBegin

j:=i;While (j>1) anh (a[j]<a[j-1]) doBegin

Swap (a[j],a[j-1]); j:=j-1;

End;End;

End;

Page 10: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.3. Độ phức tạpT(n)=O(n2)

3.4. Ví dụBan đầu: 5 6 2 2 10 12 9 10 9 3Bước 1: 5 6Bước 2: 2 5 6Bước 3: 2 2 5 6Bước 4: 2 2 5 6 10Bước 5: 2 2 5 6 10 12Bước 6: 2 2 5 6 9 10 12Bước 7: 2 2 5 6 9 10 10 12Bước 8: 2 2 5 6 9 9 10 10 12Bước 9: 2 2 3 5 6 9 9 10 10 12

Page 11: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.3. Sắp xếp nổi bọt(Buble Sort)3.3.1. Tư tưởng Bước 1: Xét các phần tử từ a[n] đến a[2], với mổi

phần tử a[j] so sánh nó vá khóa của phần tử a[j-1].

Nếu khóa của a[j] nhỏ hơn khóa của a[j-1] thì đổi

chổ a[j] với a[j-1].

Bước 2: Xét các phần tử từ a[n] đến a[3], làm tương

tự bước 1.

Bước i: Xét các phần tử từ a[n] đến a[i+1], làm tương

tự

Sau n bước ta được dãy đã có thứ tự.

Page 12: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.3.2. Thuật toán

Procedure BubbleSort;Var i,j: integer;Begin

1. For i:=1 to n do2. For j:=n downto i+1 do3. if(a[j]<a[j-1]) then4. Swap(a[j],a[j-1]);

End;

Page 13: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.3.3. Độ phức tạpT(n)=O(n)

3.3.4. Ví dụBắt đầu Bước 1 Bước 2 Bước 3 Bước 45 2 2 2 26 5 2 2 22 6 5 3 32 2 6 5 510 3 3 6 612 10 9 9 99 12 10 9 910 9 12 10 103 9 10 10 12

Page 14: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.4. Sắp xếp nhanh(Quick Sort)3.4.1. Tư tưởngXét mảng A có các bản ghi từ a[1],…,a[n].Chọn một thành phần của mảng làm

chốt(Pivot). Phân hoạch mảng thành hai phần bằng cách chuyển tất cả các thành phần có khóa lớn hơn chốt sang phải chốt, các thành phần có khóa bé hơn hoặc bằng chốt sang trái chốt.

Sắp xếp độc lập hai mảng con a[1,…k-1], a[k+1,…n] bằng cách gọi đệ quy thuật toán trên.

Page 15: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.4.2. Thuật toánProcedure QuickSort(i,j : integer);Var k: integer;Begin

If(i<j) thenBegin

Partition(i,j,);QuickSort(i,k-1);QuickSort(k+1,j);

End;End;

Page 16: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Procedure Partition(i,j: integer; var R:real);Var L: integer;

P: kiểu phần tử mảng;Begin

P:=A[i]; L:=I; R:=j+1;Repeat L:=L+1 util (A[L] > p) or (L>j);Repeat R:=R-1 util A[R] <= p;While L < R do

BeginSwap(A[L],A[R]);Repeat L:=L+1 util A[L] > p;Repeat R:=R-1 util A[R] <= p;

End;Swap(A[i],A[R]);End;

Page 17: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.4.3. Độ phức tạpT(n)=O(n)

3.4.4. Ví dụ 10 15 4 11 6 3 5 14 lấy chốt

p=A[1]=10,L=1,R=9

Lần thứ nhất: Ta có L=2 và R=7 10 5 4 11

6 3 15 14

Khi L=4, R=6. 10 5 4 3

6 11 15 14

Khi L=6,R=5 6 5 4 3

10 11 15 14

Như vậy mảng A[1..8] đã được phân hoạch thành

hai mảng con A[1..R-1] và A[R+1..8] tức A[1..4]

và A[6..8]. Sau đó tiếp tục phân hoạch hai mảng

con trên. 

Page 18: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.5. Sắp xếp vun đống(Heap Sort)3.5.1. Tư tưởngHeap là một cây nhị phân đầy đủ trái mà mổi

nút được gán một giá trị khóa sao cho giá trị khóa ở nút cha bao giờ củng nhỏ hơn hoặc bằng giá trị khóa ở hai nut con. Do đó trong Heap ta có:

Nút gốc có khóa bé nhấtDãy khóa nhận được khi đi theo một đường

bất kì là dãy có thứ tự tăng dần

Page 19: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.5.2. Thuật toánProcedure PUSHdOWN(a,b:integer);Var i,j: integer;

ok: Boolean;Begin

i:=a; ok:= false;1. While (i<=b div 2) and not ok doBegin2. If i=b div 2 then j:=2*i { chỉ có con trái }else if A[2*i] < A[2*i+1] then j:=2*i else j:=2*i+1;

3. If A[i] > A[j] thenBeginSwap(A[i],A[j]);i:=j;End;else ok:=true;End;End;

Page 20: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Sử dụng PUSHDOWN trong thủ tục HEAPSORT. Kết quả được mảng A[1…n] xếp giảm dần.Procedure HEAPSORT;Var i: integer;Begin

1. for i:=n div 2 downto 1 do PUSHDOWN(i,n);{ biến đổi mảng A[1..n] thành mảng

Heap}2. for i:=n downto 2 do

BeginSwap(A[1],A[i]); //đổi chổ gốcPUSHDOWN(1,i-1); //vun lại đống

End;End;

Page 21: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

3.5.3. Độ phức tạpT(n)=O(nlogn)

3.5.4. Ví dụ 2,3,5,6,4,1,5

Vun cây gốc A[3] được mảng A={2,3,7,6,4,1,5}Vun cây gốc A[2] được mảng A={2,6,7,3,4,1,5}Vun cây gốc A[1] được mảng A={7,6,5,3,4,1,2}Bây giờ A={7,6,5,3,4,1,2} đã là đống.Sắp xếpĐổi chổ A[1] với A[7]: A={2,6,5,3,4,1,7} và vun lại mảng A[1..6] được mảng A={6,4,5,3,2,1,7}.Đổi chổ A[1] với A[6]: A={1,4,5,3,2,6,7} và vun lại mảng A[1..5] được mảng A={5,4,2,3,1,6,7}Đổi chổ A[1] với A[5]: A={1,4,2,3,5,6,7} và vun lại mảng A[1..4] được mảng A={4,3,2,1,5,6,7}Đổi chổ A[1] với A[4]: A={1,3,2,4,5,6,7} vá vun lại mảng A[1..3] được mảng A={3,2,1,4,5,6,7}Đổi chổ A[1] với A[3]: A={2,1,3,4,5,6,7} và vun lại mảng A[1..2] được mảng A={2,1,3,4,5,6,7}Đổi chổ A[1] với A[2]: A={1,2,3,4,5,6,7}Mảng còn lại chỉ một phần tử quá trình sắp xếp đã xong.

Page 22: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

4.1. Java là gì?Java là ngôn ngữ lập trình hướng đối

tượng( tựa C++) do Sun Microsystem đưa ra

vào giữa thập niên 90. Chương trình viết bằng

ngôn ngữ java có thể chạy trên bất kì hệ điều

hành nào có cài máy ảo java( Java Vitual

Machine).

4. Giới thiệu về ngôn ngữ Java

Page 23: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

4.2. Lịch sử phát triểnNgôn ngữ lập trình Java do James Gosling và

các công sự của Công ty Sun Microsystem phát triển.

Java được phát triển dựa trên C++ nhưng loại bỏ một số tính năng nguy hiểm của C++ và có khả năng chạy trên nhiều nền phần cứng khác nhau.

Java ra đời và được giới thiệu năm 1995.

Page 24: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

4.3. Cấu trúc của JavaCông nghệ Java phát triển mạnh mẽ nhờ vào "đại gia

Sun Microsystem" cung cấp nhiều công cụ, thư viện

lập trình phong phú hỗ trợ cho việc phát triển nhiều

loại hình ứng dụng khác nhau cụ thể như: J2SE (Java 2

Standard Edition) hỗ trợ phát triển những ứng dụng

đơn, ứng dụng client-server; J2EE (Java 2 Enterprise

Edition) hỗ trợ phát triển các ứng dụng thương mại,

J2ME (Java 2 Micro Edition) hỗ trợ phát triển các ứng

dụng trên các thiết bị di động, không dây, …

Page 25: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

5. Demo

Page 26: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Code của chương trình.

Page 27: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Nhập dữ liệu cho chương trình.

Page 28: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

Kết quả sau khi sắp xếp.

Page 29: TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN

The end!Thank for your

watching!


Recommended