// Câu 2: Hãy cải tiến giải thuật tìm kiếm tuyến tính để có thể liệt kê tất cả vị
trí xuất hiện của khóa tìm kiếm
//Hàm LinearSearch() trả về i là vị trí của x trong mảng nếu tìm thấy x, ngược lại trả về -1.
int LinearSearch(int a[], int n, int x)
{ int i=0; while((i<n)&&(a[i]!=x)){ i++; } if(i==n){ return -1;//Tìm không thấy x } else{ return i;//Tìm thấy x } } //Thuật toán tìm kiếm tuyến tính sử dụng 2 phép so sánh là i<n và a[i]!=x. Trường hợp xấu nhất, mỗi phép so sánh này đều có thể thực hiện n lần. Do đó, số phép so sánh của thuật toán trong trường hợp xấu nhất là 2*n. Độ phức tạp của thuật toán là O(n). int LinearSearch(int a[], int n, int x){ int i=0; a[n]=x; //a[n] là phần tử “lính canh” while(a[i]!=x){ i++; } if(i==n){ return -1; //Tìm không thấy x } else{ return i; //Tìm thấy x } } //Thuật toán tìm kiếm tuyến tính cải tiến chỉ sử dụng 1 phép so sánh a[i]!=x. Trường hợp xấu nhất, số phép so sánh của thuật toán là n. Tức là giảm được phân nữa phép so sánh của thuật toán tìm kiếm thông thường. // nếu dùng vòng lặp for thì code là tối ưu nhất , maybe int search(int arr[], int n, int x) { for (int i = 0; i < n; i++) if (arr[i] == x) return i; return -1; }