Chương 5: Arrays – Mảng Mục tiêu của bà
5.1.2 Sắp xếp mảng
Luôn cần thiết để sắp xếp các phần tử trong mảng theo giá trị có thứ tự từ cao đến thấp (thứ tự giảm dẫn - descending order) hoặc ngược lại (thứ tự tăng dần – ascending order).
Quá trình sắp xếp mảng cần phải hoán đổi giá trị giữa các phần tử mảng. Có nhiều cách khác nhau để sắp xếp mảng. Các cách sắp xếp giống nhau ở chỗ chúng đều so sách mỗi phần tử trong mảng với phần tử khác và hoán đổi giá trị nếu giá trị đặt sai vị trí.
Quá trình sắp xếp hoán đổi thực hiện với các phần tử bắt đầu tập giá trị. Kiểu sắp xếp này so sánh giá trị của phần tử đầu tiên với mỗi phần tử tiếp theo và thực hiện các hoán đổi cần thiết. Tiếp đến phần tử thứ hai sẽ được so sánh với mỗi phần tử tiếp theo còn lại trong mảng và thực hiện các hoán đổi cần thiết. Tương tự với các phần tử còn lại trong mảng đến khi không còn hoán đổi nào xảy ra ở bước cuối cùng.
Hình 5.1 mô tả khái niệm của sắp xếp hoán đổi.
65 10 57 98 105 304
Hình 5.1 : Sắp xếp hoán đổi
Bảng 5.2 chỉ rõ các phần tử được sắp xếp theo thứ tự tăng dần sau mỗi bước. Mỗi bước bắt đầu từ khi lấy một phần tử và so sánh với các phần tử còn lại tiếp theo trong mảng, nếu cần thiết, thực hiện các hoán đổi giá trị của các phần tử.
Các giá trị gốc trong mảng
65 10 57 98 105 304
Sau bước thứ nhất 304 10 57 65 98 105
Sau bước thứ hai 304 105 10 57 65 98
Sau bước thứ ba 304 105 98 10 57 65
Sau bước thứ tư 304 105 98 65 10 57
Sau bước thứ năm 304 105 98 65 57 10
Đầu tiên 2 phần tử (65 và 10) được so sánh và giá trị lớn hơn sẽ được dời sang bên trái. Trong trường hợp này, 10 nhỏ hơn 65; nên không hoán đổi. Tiếp theo, so sánh giá trị đầu tiên với giá trị thứ 3 (65 và 57) và cũng tương tự, không hoán đổi. Sau đó, phần tử đầu tiên và phần tử thứ 4 (65 và 98) được so sánh và hoán đổi vị trí, đưa 98 lên đầu và 65 về vị trí thứ 4. Cứ như vậy so sánh phần tử đầu tiên với tất cả các phần tử còn lại tiếp theo trong mảng, giá trị lớn nhất 304 sẽ được đặt vào phần tử đầu tiên. Kết thúc bước lặp thứ 2 giá trị lớn nhất thứ 2 (304) sẽ được đặt vào vị trí thứ hai. Quá trình tiếp tục và giá trị nhỏ nhất được đặt vào cuối danh sách khi kết thúc.
Đoạn mã 4 minh họa cách sắp xếp các phần tử theo thứ tự giảm dần trong Java.
Đoạn mã 4 :
int [] array = {65,10,57,98,105,304}; int i,j;
int temp ;
// lấy chiều dài của mảng
int arrayLength = array.length;
// phần tử được so sánh trong vòng lặp này for (i=0; i< (arrayLength -1);i++)
{ for (array[i]<array[j]) { //hoán đổi vị trí temp = array[i]; array[i] = array[j]; array[j] = temp; } } }
// hiển thị các giá trị sau khi sắp xếp for(i=0;i<array.length; i++) { System.out.println(array[i]+”\t”); } Kết quả hiển thị là : 304 105 98 65 57 10 5.1.3 Tìm kiếm trong mảng
Có nhiều cách khác nhau để tìm kiếm giá trị trong một mảng.. Trong tất cả các cách tìm kiếm, tìm kiếm tuần tự là cách đơn giản và dễ cài đặt nhất. Trong tìm kiếm tuần tự, giá trị cần tìm được so sánh với các giá trị của mảng bắt đầu từ
Chương 5 Mảng
65/114 phần tử đầu tiên. Vì cách tìm kiếm này thực hiện theo dạng tuyến tính nên còn được gọi là tìm kiếm tuyến tính (linear search). Tuy nhiên, nếu thực hiện tìm trên mảng không được sắp xếp thì chậm.
Kỹ thuật hiểu quả nhất có thể được áp dụng để tìm các phần tử trong một mảng được sắp xếp là kỹ thuật tìm kiếm nhị phân. Kỹ thuật này nhanh hơn so với các phương thức tìm kiếm khác. Kỹ thuật này kiểm tra phần tử nằm giữa của mảng. Nếu giá trị cần tìm bằng phần tử ở giữa, thì tìm kiếm kết thúc. Nếu giá trị cần tìm nhỏ hơn phần tử ở giữa, thì thực hiện tìm nhị phân trên nữa phần đầu của mảng. Nếu lớn hơn, thì thực hiện tìm nhị phân trên nữa phần sau của mảng. Trước khi thực hiện tìm kiếm nhị phân thì mảng phải được sắp xếp.
Hình 5.2 minh họa kỹ thuật tìm kiếm nhị phân trên một mảng đã được sắp xếp. Giá trị cần tìm là 11.
Hình 5.2 Kỹ thuật tìm kiếm nhị phân
Đoạn mã 5 mô tả mã Java cho thực hiện tìm kiếm nhị phân Đoạn mã 5 :
int [] array = {0,11,13,14,15,17,18,19,21,24,26,28,29}; int low =0;
int high = array.length -1; int searchValue = 11;
int flag =0; while(low<=high) {
int mid = low + (high – low)/2; if(searchValue == array[mid]){ flag = 1;
System.out.println(“ Element found at index “ + mid); Break;
} else if(searchValue<array[mid]){ high = mid -1;
}else if (searchValue > array[mid]){ low = mid +1;
} }
if(flag ==0){
System.out.println(“Element not found in the array”); }
Kết quả được hiển thị như dưới : Element found at index 1