Rumah > pembangunan bahagian belakang > C++ > Program C++ untuk mencari elemen dalam tatasusunan yang disusun dan diputar

Program C++ untuk mencari elemen dalam tatasusunan yang disusun dan diputar

WBOY
Lepaskan: 2023-09-15 09:41:02
ke hadapan
1091 orang telah melayarinya

Program C++ untuk mencari elemen dalam tatasusunan yang disusun dan diputar

Kami mendapat tatasusunan diisih diputarkan mengelilingi satu titik. Kami juga mendapat kunci untuk mencari dalam tatasusunan. Logik yang digunakan untuk mencari elemen dalam tatasusunan berputar ini ialah -

  • Pertama, kita mencari elemen tengah tatasusunan. Jika kunci wujud, kami kembalikan bahawa kunci itu wujud dalam tatasusunan.

  • Jika kunci tiada di tengah, kita boleh lihat jika bahagian kiri tatasusunan (dari kiri ke tengah) diisih. Jika disusun, anda boleh mencari kunci di sebelah kiri, jika tidak anda boleh mencari kunci di sebelah kanan (tengah+1, kanan)

  • Jika kunci tidak dijumpai di tengah, dan bahagian kiri tidak diisih, maka kita akan menyusun bahagian kanan, dan kemudian kita boleh melihat sama ada kunci itu wujud di bahagian kanan, atau kita akan mencari tatasusunan di bahagian kanan Bahagian kiri

  • Jika tidak kami akan kembali yang tidak dapat ditemui.

Mari kita lihat beberapa senario input dan output di bawah -

Bayangkan terdapat array yang terdiri daripada elemennya. Contohnya, 2, 5, 7, 9, 11, selepas putaran, menjadi 5, 9, 11, 2, 7. Katakan kunci tatasusunan ialah 2.

Input: arr[] = {5, 9, 11, 2, 7}, Key=2
Output: Element "2" found at 3rd index
Salin selepas log masuk

Mari kita anggap satu lagi senario di mana kunci tidak berada dalam tatasusunan yang ditentukan.

Input: arr[] = {10, 23, 45, 77, 84}, Key=90
Output: Element "90" not found.
Salin selepas log masuk

Algoritma

Langkah berikut adalah cara untuk mencapainya.

  • Cari elemen tengah tatasusunan.

  • Pahasi tatasusunan kepada dua bahagian. (tengah = kiri + kanan) / 2

  • Periksa sama ada kunci ialah elemen perantaraan.

  • Lain jika , semak elemen di sebelah kiri tatasusunan dan ia diisih

  • lain jika, tandakan elemen yang betul (pertengahan+1, kanan)

  • Jika tidak, susun bahagian kiri dan semak

  • Jika tidak, kembalikan elemen yang tidak ditemui.

Contoh

Sebagai contoh, katakan kita mempunyai tatasusunan "2,3,4,5,6,7,8", dan tatasusunan yang diputar ialah "5,6,7,8,2,3,4". Kunci tatasusunan ini ialah 2.

Pelaksanaan C++ bagi operasi ini adalah seperti berikut -

#include <iostream>
#include <vector>
using namespace std;
bool solve(vector<int> arr, int left, int right, int key) {
   if (left > right) {
      return false;
   }
   int mid = (left + right)/2;
   if (arr[mid] == key) {
      return true;
   }
   if (arr[left] <= arr[mid]) {
      if (key >= arr[left] && key <= arr[mid]) {
         return solve(arr, left, mid-1, key);
      }
      return solve(arr, mid+1, right, key);
   }
   if (key >= arr[mid] && key <= arr[right])
      return solve(arr, mid+1, right, key);
   return solve(arr, left, mid-1, key);
}
int main() {
   vector<int> arr = {5, 6, 7, 8, 2, 3, 4};
   int key = 2;
   if(solve(arr, 0, arr.size()-1, key)) cout << key << " is present";
      else cout << key << " is not present";
   return 0;
}
Salin selepas log masuk

Output

2 is present
Salin selepas log masuk

KESIMPULAN

Cara lain untuk menyelesaikan masalah ini ialah mencari titik pangsi atau indeks putaran tatasusunan dan kemudian lakukan carian binari pada tepi. Kaedah kami hanya memerlukan 1 carian binari untuk menyelesaikan masalah. Setiap kali kita melihat mencari dan menyusun tatasusunan, kita harus menganggap carian binari sebagai salah satu kaedah carian.

Atas ialah kandungan terperinci Program C++ untuk mencari elemen dalam tatasusunan yang disusun dan diputar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan