boubble sorun
Transkript
boubble sorun
Alıştırma 1: Yineleme Alıştırma 2: Yineleme H10->H2 çevrimini yapınız 7 1 2 3 1 2 1 2 1 0 Hafta 3: Yineleme Alıştırmaları(1) E1. (44/174) S değerini yineleme kullanarak hesap ediniz – S = 1 + 2 + 3 + …n Hafta3: Yineleme Alıştırmaları (2-3) E3(a). Bir sayıyı tersten yazdıran bir program yazımız. Örnek: input n=12345. Print out: 54321. E3(b). Bir sayıyı olduğu gibi yazdıran programı yineleme ile yeniden yazdırınız. Örnek: input n=12345. Print out:12345. Hafta3: Yineleme Alıştırmaları (4) E4. Bir tamsayının elemanlarını toplayarak sonucu elde eden programı yineleme mantığı ile yazınız. Örnek: n=1980 => Toplam=1+9+8+0=18. Hafta3: Yineleme Alıştırmaları(5) E4. aşağıdaki hesabı yineleme mantığı ile kodlayınız : – S=a[0]+a[1]+…a[n-1] A: tamsayıların bir dizisi Hafta3: Yineleme Alıştırmaları (6) E4. bir dizideki bir elemanı yinelemeli bir fonksiyon yardımıyla bulma (doğrusal arama algoritması kullanılacak) Hafta3: Yineleme Alıştırmaları (7) Üçgenleri yazdırın c a b d Hafta3 Kısım 3: ARAMA TEKNİKLERİ 1. DOĞRUSAL (SIRALI) ARAMA 2. İKİLİ ARAMA 3. ALGORİTMALARIN KARMAŞIKLIĞI ARAMA TEKNİKLERİ Bir elemanın listede olup olmadığını bulmak için yerine getirilir. 2 yöntemi vardır: doğrusal arama ve ikili arama Kullanılacak metot veri listesinin nasıl organize edildiği ile ilgilidir – Sırasız liste: Doğrusal arama: basit, yavaş – Sıralı liste: İkili ve doğrusal arama: karmaşık, daha hızlı 1. DOĞRUSAL (SIRALI) ARAMA Nasıl? – – – – Aranan eleman listedeki elemanlarla sırayla karşılaştırılır Bu işlem eleman bulunana kadar veya liste sonuna varana kadar devam eder. Eğer eleman bulunursa geriye elemanın sırası bilgisi döndürülür Eğer listenin sonuna kadar bir eşleşme olmazsa arama başarısızlıkla sonuçlanır. 1. DOĞRUSAL (SIRALI) ARAMA void lsearch(int list[],int n,int element) { int i, flag = 0; for(i=0;i<n;i++) if( list[i] == element) { cout<<“found at position”<<i); flag =1; break; } if( flag == 0) cout<<“ not found”; } flag: what for??? 1. DOĞRUSAL (SIRALI) ARAMA int lsearch(int list[],int n,int element) { int i, find= -1; for(i=0;i<n;i++) Farklı bir flag kullanımı if( list[i] == element) {find =i; break;} return find; } average time: O(n) 2. İKİLİ ARAMA İlk olarak liste sıralanır Biz aranan elemanı listenin ortasındaki elemanla karşılaştırırız. Eğer bir eşleşme bulunursa, arama başarıyla sonlanır. Aksi takdirde, biz aranan eleman ile ortadaki elemanın durumuna göre listenin sağ tarafında veya sol tarafında aramaya devam ederiz. Baba? Eat? void bsearch(int list[],int n,int element) { int l,u,m, flag = 0; l = 0; u = n-1; while(l <= u) { m = (l+u)/2; if( list[m] == element) {cout<<"found:"<<m; flag =1; break;} else if(list[m] < element) l = m+1; else u = m-1; } if( flag == 0) cout<<"not found"; } average time: O(log2n) İKİLİ ARAMA: Yineleme int Search (int list[], int key, int left, int right) { if (left <= right) { int middle = (left + right)/2; if (key == list[middle]) return middle; else if (key < list[middle]) return Search(list,key,left,middle-1); else return Search(list,key,middle+1,right); } return -1; } 3. ALGORİTMA KARMAŞIKLIĞI Bilgisayar biliminde, algoritmaların kalitesini ölçmek önemlidir, özellikle algoritmaların ihtiyaç duyduğu kaynaklar bakımından Kaynaklar: zaman veya bellek alanı Aynı işi yapan farklı algoritmalar daha az veya daha fazla zamana, belleğe veya emeğe ihtiyaç duyabilirler. Bu analizin güçlü bir matematiksel geri planı vardır. Bir algoritmanın kalitesini bulma yolu genellikle Asymptotic Notation veya Big O olarak adlandırılır. 3. ALGORİTMA KARMAŞIKLIĞI Genellikle olarak yazılır Polinom zamanlı algoritmalar, – – – O(1) --- sabit zamanlı --- problem boyutuna bağlı olarak zaman değişmez. O(n) --- doğrusal zamanlı --- problem boyutu büyüdükçe zaman doğrusal olarak artar. O(n2) --- ikinci dereceden zaman --- problem boyutunun karesi hızında problem karmaşıklığı artar. Big O notasyonu kullanılırken en büyük karmaşıklık problemin karmaşıklığını verir. Örnek; O(3n2 + 3n + 7) = O(n2) Alt-doğrusal zamanlı algoritmalar – O(logn) – logaritmik zaman Süper polinomsal zamanlı algoritmalar – – O(n!) O(2n) 3. ALGORİTMA KARMAŞIKLIĞI Örnek1: bir algoritmanın karmaşıklığı void f ( int a[], int n ) { int i; cout<< "N = “<< n; for ( i = 0; i < n; i++ ) cout<<a[i]; printf ( "n" ); } 2 * O(1)? + O(N) O(N) ? 3. ALGORİTMA KARMAŞIKLIĞI Örnek2: bir algoritmanın karmaşıklığı void f ( int a[], int n ) { int i; cout<< "N = “<< n; // O(1) 2) 2 * O(1) + O(N)+O(N ? for ( i = 0; i < n; i++ ) for (int j=0;j<n;j++) cout<<a[i]<<a[j]; // O(N2) for ( i = 0; i < n; i++ ) cout<<a[i]; // O(N) printf ( "n" ); // O(1) } O(N2) ? 3. ALGORİTMA KARMAŞIKLIĞI Doğrusal arama – O(n). İkili arama – O(log2 N) Hafta4: (Kısım4) 20 puanlık test – – Küçük bir program yazın Bir dizinin eleman sayısını girin Dizinin elemanlarını girin Diziyi ekranda gösterin Bir değer alın. Doğrusal aramayı kullanarak ilk eşleşmenin pozisyonunu bulun enterarray, displayarray, linearfind fonksiyonlarını kullanarak bu işlemi yapın. Hafta 4: (Kısım 4) SIRALAMA TEKNİKLERİ Neden? – – İkili aramayı kullanırız Bazı işlemleri daha hızlı yapar SORTING SIRALAMA TEKNİKLERİ Verilen n adet elemanın bir kümesi – Bir dizi, kelimeler kümesi veya benzeri olabilir Varsayım elemanlara erişim için bir sıra vardır Hedef elemanları artan sırada bir sırada düzenleme – – Başlangıç Sonuç 1 23 2 56 9 8 10 100 1 2 8 9 10 23 56 100 SIRALAMA TEKNİKLERİ Bubble sort, Insertion sort, Selection sort, Quick sort, Heap sort, Merge sort, Exchange sort … Çalışılacak sıralama teknikleri – – – – – Bubble sort Insertion sort Selection sort Exchange sort Quick sort SIRALAMA TEKNİKLERİ Average Worst Bubble sort O(n2) Exchange sort Insertion sort O(n2) O(n2) Selection sort O(n2) O(n2) Quick sort O(n2) O(nlogn) O(n2) 1.Bubble sort: ana fikir Listenin elemanlarını komşu elemanların çiftlerini kullanarak düzenler. ith ve (i+1)th eleman bir çift oluşturur. Eğer sıra artan ise, biz listenin elemanlarını yer değiştiririz. Bu, geriye kalan n-1 elemanın en büyüğünü n-1 pozisyonuna getirecektir. 1.Bubble sort: idea Why it is called Bubble? 3 7 5 2 4 compare 3 and 7 ; 7 is > 3 so advance 3 5 7 2 4 compare 7 and 5, 7 > 5 so swap them 3 5 2 7 4 compare 7 and 2, 7 >4 so swap them 3 5 2 4 7 compare 7 and 4, 7 >4 so swap them End of pass 1; notice that 7 is in the right place 2.Bubble sort: ana fikir En basit sıralama algoritması Ana fikir: – – 1.flag = false 2.Diziyi hareket ettir ve elemanları ikili olarak karşılaştır 1.1 If E1 ≤ E2 - OK 1.2 If E1 > E2 then Switch(E1, E2) and set flag = true – 3. If flag = true goto 1. İşlem tamam. 1.Bubble sort: algoritmanın fikri void bubbleSort (Array S, length n) { boolean isSorted = false; while(!isSorted) { isSorted = true; for(i = 0; i<n; i++) if(S[i] > S[i+1]) { swap(S[i],S[i+1];) isSorted = false; } } 1.Bubble sort: gerçekleştirim void bsort(int list[], int n) { int count,j; for(count=0;count<n-1;count++) for(j=0;j<n-1-count;j++) if(list[j] > list[j+1]) swap(list[j],list[j+1]); } 2. Exchange Sorting Method : veri n-1 kere taranır, her bir taramada komşu elemanlar karşılaştırılır, gerekli ise n-1 karşılaştırma yapılır O(n2) 2. Exchange Sorting void Exchange_sort(int arr[], int n) { int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(arr[i] > arr[j]) swap(arr[i],arr[j]); } 2. Exchange Sorting Notlar: – – – Her başarılı taramada, bir tane daha az karşılaştırma yapılır, çünkü son eleman her tarama sonunda yerini bulur Eğer bir taramada hiç değişiklik olmazsa işlem sona erer Performansını artırmak için bazı çalışmalar yapılmış olmakla birlikte hala karmaşıklığı O(n2) dir.