Quick Sort Algoritması (Hızlı Sıralama Algoritması)

Benzer belgeler
Merge Sort Bireşen Sıralama

Insertion Sort. (Sokuşturma Sıralaması)

Merge (Bireşim) Algoritmayı önce bir örnek üzerinde açıklayalım.

YZM 2116 Veri Yapıları

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

VERİ YAPILARI DATA STRUCTURE GİRİŞ

İST 264 VERİ YAPILARI Bitirme Sınavı A Grubu

D İ Z İ L E R A R R A Y S

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

Algoritmalar. Doğrusal Zamanda Sıralama. Bahar 2017 Doç. Dr. Suat Özdemir 1

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Veri Yapıları ve Algoritmalar dönem

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Dizi ( Array ) ve Dizgi ( String )

Java String İşlemleri

JAVADA DİZİ İŞLEMLERİ

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

1. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

Arasınav Örnek Soruları Bahar 2018

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

SIRALAMA SORTING. Doç. Dr. Aybars UĞUR

Kıyametin Kopacağı Gün (Hanoi Bilmecesi)

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Örnek 1: Programı yazın ve çalıştırın.

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

YMT219 VERİ YAPILARI ÖDEV-1

Ders - 7 while döngüsü

SIRALAMA SORTING. Yrd. Doç. Dr. Aybars UĞUR

DÖNGÜLER BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA DENEY-4 FÖYÜ GİRİŞ LABORATUARI.

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 4. UYGULAMA

Sınav Dağılım & IMKB Endeks

// hataları işaret eden referans

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 9. UYGULAMA

I Java Veri Yapıları 1

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

7. HAFTA. Erişim Belirleyiciler

Programlama Dilleri 3

F(A, N, K) // A dizi; N, K integer if N<0 then return K; if A[N]>K then K = A[N]; return F(A, N-1, K);

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Örneğin iki sayının toplamının hesaplayacak bir fonksiyon şöyle tanımlanabilir:

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 8: Sınıf (Class) Yapılarına Giriş

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

BİL1001 Bilgisayar Bilimlerine Giriş 1

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

Javada Diziler. Javada diziler

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

BIL101 07/11/2012 Lab5 Programlama Sorulari

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ. Yard. Doç. Dr. Deniz KILINÇ

public static int Toplam int x, int y

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

Arasınav Soruları Bahar 2018

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

BİL-141 Bilgisayar Programlama I (Java)

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Java Class Yapısında Finalize Metotunun Kullanımı

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Final Sınavı Örnek Soruları Bahar 2018

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

Bilgisayar programlamanın üç temel mantık yapısından biridir. Diğer ikisi ise Seçilim(Selection) ve Döngü(Loop, Iteration)dür.

HSancak Nesne Tabanlı Programlama I Ders Notları

static void dizi_24() { Random rnd = new Random(); int [] tutulan=new int[10]; int dogru;

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

KUYRUKLAR. Doç. Dr. Aybars UĞUR

11- FONKSİYONLAR (FUNCTIONS)

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Karşılaştırma İşlemleri ve Koşullu İfadeler

Algoritmalar. Sıralama Problemi ve Analizi. Bahar 2017 Doç. Dr. Suat Özdemir 1

Bİ L 131 Hafta 2. 1) Bilgisayara Java SE Development Kit 7 kurulması

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

JAVADA METOTLAR. BMÜ-111 Algoritma ve Programlama. Yrd. Doç. Dr. İlhan AYDIN

İleri Diferansiyel Denklemler

Özyineleme (Recursion)

MAT213 Bilgisayar Programlama I

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

İf Else, Kisa İf? Ve Switch Operatoru

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

C# Console Uygulamaları ifelse Yapıları 2

Dinamik Programlama. En uzun ortak altdizi En uygun altyapı Altproblemlerin çakışması

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

ARRAY Alıştırmalar. Program 1: Aşağıdaki program, array kullanmadan, 5 tane değişken tanımlayıp, onların değerlerini konsola yazıyor.

ALGORİTMA ANALİZİ. Cumhuriyet Üniversitesi Bilgisayar Mühendisliği Bölümü

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

b) Algoritmanızın en kötü durumda işlem zamanını asimptotik olarak bulunuz

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Java: printf() Metodu İle Çıktıyı Biçemleme

Transkript:

Quick Sort Algoritması (Hızlı Sıralama Algoritması) Quick Sort (Hızlı Sıralama) algoritması C.A.R.Hoare tarafından bulunan etkin bir sıralama yöntemidir. Siyaset biliminde çok kullanılan böl ve yönet stratejisine dayanan basit ve hızlı bir sıralama yöntemi kullanır. Zaman karmaşası, ortalama O(nlogn) ve en kötü durumda ise O(n 2 ) dir. Bu algoritma, başlarken dizinin terimleri arasından bir terimi mihenk (pivot) olarak seçer. Sonra verilen diziyi üç alt diziye ayrıştırır. Mihenk ten küçük olan terimlerin hepsini (soldaki) birinci altdiziye taşır. İkinci alt dizi biricik öğesi mihenk olan tek terimli {mihenk altdizsidir. Mihenk ten büyük olan terimlerin hepsini (sağdaki) ikinci altdiziye taşır. Sonra sol ve sağ altdizilere aynı ayrıştırma yöntemini, altdiziler tek terimli birer diziye indirgenene kadar uygular ve sıralama işlemi biter. Algoritma özyinelgendir (recursive). Quick Sort algoritmasını bir örnek üzerinde açıklayacağız. {2, 17, -4, 42, 9, 26, 11, 3, 5, 28 dizisi (array) verilsin. Bu dizinin öğelerinin değerlerini birer karta yazalım ve aşağıdaki gibi on gözü olan bir kutuya verilen dizinin indislerinin artan sırasıyla yerleştirelim. 2 17-4 42 9 26 11 3 5 28 Şimdi dizinin terimleri arasından birisini mihenk (pivot) olarak seçelim. Hangi terimin mihenk seçildiği algoritmayı etkilemez. Hatta, dizinin öğeleri arasında olmayan bir sayı bile mihenk olarak seçilebilir. Ama yapacağımız işlemde eş uygulamayı sağlamak için mihengi şöyle seçelim: Ayrıştırılacak (alt) dizinin ilk teriminin indisi ile son teriminin indislerini toplayıp 2 ye bölelim. Bölümün tamsayı parçasını mihengin indisi olarak seçelim. Bu yolla her altdizinin mihengini bulabiliriz. Örneğin, henüz ayrışmamış bir altdizinin ilk teriminin indisi s, son teriminin indisi t ise mihengin indisi (s+t)/2 olacaktır. Bu indis (s+t)/2 tamsayı bölümüdür; yani (s+t)/2 bölümünün tamsayı kısmıdır. Başka bir deyişle, (s+t)/2 den daha büyük olmayan en büyük tamsayıdır. Başlangıçta, verilen dizinin ilk teriminin indisi 0, son teriminin indisi 9 olduğuna göre, ilk mihengin indisi (0+9)/2 = 4 olur. O halde a[4]=9 terimini mihenk olarak seçeceğiz. Bu terimi sabit (mihenk, pivot) tutarak, diziyi 9 un solundakiler, 9 un sağındakiler ve {9 olmak üzere üç alt diziye ayrıştıracağız. (Tabii, istenirse 0 ile 9 arasındaki herhangi bir indisin seçilebileceğini ve seçilen indisin algoritmayı etkilemeyeceğini unutmuyoruz.) Şimdi (a[4]=9) mihenginin solunda 9 dan büyük olan terimler varsa onları sağ tarafa taşıyacağız. Benzer şekilde, 9 un sağında 9 dan küçük terimler varsa, onları sol tarafa taşıyacağız. Özel olarak mihenge eşit olan başka terimler varsa, onları sağa ya da sola taşıyabiliriz. Bu işleri yaparken, kutudaki gözlerin sayısının 10 olduğunu ve gözlerin sayısının artamayacağını, iki kartı üst üste koyamayacağımızı unutmayacağız ve ayrıştırmada mümkün olduğu kadar az takas işlemi yapmaya çalışacağız. Bunun için pratik bir yöntem bulabiliriz. Sol elimizin işaret parmağı en soldaki a[0] dan başlayarak sağa doğru terimleri tarasın. Belli bir anda işaret ettiği gözün indisine sol diyelim. Sol parmağımızın sırayla işaret ettiği her terimi mihenk ile karşılaştıralım. Parmağımız solda mihenkten (a[4]=9) büyük olan ilk terimi işaret edince, o gözdeki kartı sol elimize alalım. Bu sayı a[1]=17 dir. Sol elimizde 17 yazılı kart dururken, sağ elimizin işaret parmağı en sağdaki a[9] dan başlayarak sola doğru terimleri tarasın. Belli bir anda işaret ettiği gözün indisine sağ diyelim. Sağ parmağımızın sırayla işaret ettiği her terimi mihenk ile karşılaştırsın. Sağda 9 dan küçük olan ilk terimi içeren kartı 1

sağ elimize alalım. Bu terim a[8]=5 sayısıdır. Şimdi sol elimizdeki 17 ile sağ elimizdeki 5 sayılarının yerlerini kendi aralarında değiştirelim (takas). 17 yazılı kartı a[8] gözüne, 5 yazılı kartı a[1] gözüne taşıyalım. Bu işlem, sol ve sağ ellerimizdeki kartların alındığı gözlerin kendi aralarında değiştirilmesi; yani iki sayının yerlerinin takas (mübadele) edilmesi işlemidir. Bu eylemde göz sayısı artmaz ve iki kart üst üste gelmez. Her takas işlemi, diziyi ayrıştıran adımlardan birisidir. 2 5-4 42 9 26 11 3 17 28 Aynı işlemi solda 9 dan büyük, sağda 9 dan küçük olan her sayı çifti için tekrarlayacağız. Hemen görüldüğü gibi, 42 ile 3 sayılarının yerleri değişecektir. 2 5-4 3 9 26 11 42 17 28 Yukarıda anlatılan takas işlerini, işaret parmaklarımız mihenk üzerinde çakışana kadar sürdüreceğiz. Bu eylem sonunda, diziyi {2, 5, -4, 3, {9 ve {26, 11, 42, 17, 28 olmak üzere üç altdiziye ayırmış oluruz. 2 5-4 3 9 26 11 42 17 28 Soldaki altdizideki her terim, sağdaki altdizideki her teriminden küçüktür. Şimdi soldaki ve sağdaki altdizileri yeni dizilermiş gibi düşünüp, yukarıdaki yöntemle onları ayrıştırabiliriz. Sonra onların da sol ve sağ alt dizilerini ayrıştırabiliriz. Bu süreç, alt diziler tek terimli birer diziye indirgenene kadar devam edecektir. Örneğin, soldaki alt diziyi ayrıştıralım. Her adımda, altdizilerin mihenkleri yeşil ile, takas edilen öğeler ise kırmızı renkle işaretlidir. Sol alt dizinin ayrıştırılması: {2, 5, -4, 3 a[1] = mihenk = 5, indis = (0+3)/2 = 1 {2, 3, -4, 5 takas: 3 ile 5 {2, -4, 3, 5 takas: -4 ile 3 {2, -4, 3 {5 alt dizilere ayrışma {-4, 2, 3 {5 takas: -4 ile 2 {-4, {2, {3, {5 tek öğeli dizilere indirgenmiş {-4, 2, 3, 5 Sıralanmış sol alt dizi Sağ alt dizinin ayrıştırılması: {26, 11, 42, 17, 28 a[7] = mihenk = 42, indis = (6+9)/2 = 7 {26, 11, 28, 17, 42 takas: 42 ile 28 {26, 11, 28, 17 {42 ayrıştır {11, 26, 42, 17, 28 takas: 26 ile 11 {11 {26, 28, 17 {42 ayrıştır {11 {26, 17, 28 {42 takas: 28 ile 17 {11 {26, 17 {28 {42 ayrıştır {11 {17, 26 {28 {42 takas: 17 ile 26 {11 {17 {26 {28 {42 ayrıştır {11, 17, 26, 28, 42 Sıralanmış sağ alt dizi 2

Sıralanmış dizi: -4 2 3 5 9 11 17 26 28 42 Yukarıda söylediklerimizin, her adımda dizide yaptığı değişiklikleri aşağıdaki tablodan görebiliriz. Altdizilerin sol ve sağ indislerinin ve mihengin değişimlerine dikkat ediniz. sol sağ mihenk Açıklama 2 17-4 42 9 26 11 3 5 28 1 8 9 2 5-4 42 9 26 11 3 17 28 1 8 3 7 9 2 5-4 3 9 26 11 42 17 28 3 7 4 4 9 2 5-4 3 9 26 11 42 17 28 ayrışma 1 3 5 2 3-4 5 9 26 11 42 17 28 1 3 1 2 2-4 3 5 9 26 11 42 17 28 1 2-4 2-4 3 5 9 26 11 42 17 28 ayrışma 0 1-4 2 3 5 9 26 11 42 17 28 0 1 42-4 2 3 5 9 26 11 42 17 28 ayrışma 7 9-4 2 3 5 9 26 11 28 17 42 7 9 5 8 11-4 2 3 5 9 26 11 28 17 42 ayrışma 5 6-4 2 3 5 9 11 26 28 17 42 5 6 6 8 28-4 2 3 5 9 11 26 28 17 42 ayrışma 7 8 28-4 2 3 5 9 11 26 17 28 42 7 8 6 7 26-4 2 3 5 9 11 26 17 28 42 ayrışma 6 7 26-4 2 3 5 9 11 17 26 28 42 6 7-4 2 3 5 9 11 17 26 28 42 sıralandı Böylece verilen dizinin öğeleri küçükten büyüğe doğru sıralanmış olarak kutunun gözlerine yerleştirilmiş olur. Quick Sort Algoritmasını yapan bir java metodu yazalım: void quicksort(int[] a, int altindis, int üstindis) { // altindis o adımda sıralanan altdizinin ek küçük indisidir // üstindis o adımda sıralanan altdizinin ek büyük indisidir int i = altindis, j = üstindis, h; // x terimi, mukayesenin yapılacağı mihenk'dir (pivot) int x = a[(altindis + üstindis) / 2]; // Takas eylemiyle diziyi ayrıştırma do { while (a[i] < x) while (a[j] > x) if (i <= j) { h = a[i]; a[i] = a[j]; a[j] = h; while (i <= j); // yinelge (recursion) if (altindis < j) quicksort(a, altindis, j); if (i < üstindis) quicksort(a, i, üstindis); 3

Şimdi bunu bir java uygulamasında çalıştıralım: //package hızlısıralama; import java.util.arrays; public class HızlıSıralama { int[] arr = { 2, 17, -4, 42, 9, 26, 11, 3, 5, 28 ; void quicksort(int[] a, int altindis, int üstindis) { // altindis o adımda sıralanan altdizinin ek küçük indisidir // üstindis o adımda sıralanan altdizinin ek büyük indisidir int i = altindis, j = üstindis, h; // x terimi, mukayesenin yapılacağı mihenk'dir (pivot) int x = a[(altindis + üstindis) / 2]; // Takas eylemiyle diziyi ayrıştırma do { while (a[i] < x) while (a[j] > x) if (i <= j) { h = a[i]; a[i] = a[j]; a[j] = h; while (i <= j); // yinelge (recursion) if (altindis < j) quicksort(a, altindis, j); if (i < üstindis) quicksort(a, i, üstindis); public static void main(string[] args) { HızlıSıralama qs = new HızlıSıralama(); System.out.println("Sıralamadan önce: "); System.out.println(Arrays.toString(qs.arr)); qs.quicksort(qs.arr, 0, 9); System.out.println("Sıralamadan sonra:"); System.out.println(Arrays.toString(qs.arr)); Aşağıdaki quicksort() metodu aynı işi yapar. //package hızlısıralama; import java.util.arrays; public class HızlıSıralama { int[] arr = {2, 17, -4, 42, 9, 26, 11, 3, 5, 28 ; void qsortint(int a[], int min, int max) { 4

int altindis = min; int üstindis = max; int mid; if (max > min) { * mihenk (pivot) terimi bulunuyor mid = a[(min + max) / 2]; // isdisler çakışana ya da çapraz olana kadar döngü sürüyor while (altindis <= üstindis) { * Soldan başlayarak, mihenkten küçük olanlara dokunmadan geç * mihenk'e eşit ya da büyük olanı bulunca dur ve bekle while ((altindis < max) && (a[altindis] < mid )) *Sağdan başlayarak, mihenkten büyük olanlara dokunmadan geç * mihenk'e eşit ya da küçük olanı bulunca dur ve bekle while ((üstindis > min) && (a[üstindis] > mid )) // Eğer altindis <= üstindis ise takas yap if (altindis <= üstindis) { int t = a[üstindis]; a[üstindis] = a[altindis]; a[altindis] = t; * Eğer üstindis arrayin sol ucuna erişmediyse * soldaki alt diziyi ayrıştır if (min < üstindis) qsortint(a, min, üstindis); * Eğer altindis arrayin sağ ucuna erişmediyse * sağdaki alt diziyi ayrıştır if (altindis < max) qsortint(a, altindis, max); public static void main(string[] args) { HızlıSıralama intsort = new HızlıSıralama(); System.out.println("Sıralamadan önce: "); System.out.println(Arrays.toString(intSort.arr)); intsort.qsortint(intsort.arr, 0, 9); System.out.println("Sıralamadan sonra:"); System.out.println(Arrays.toString(intSort.arr)); 5

Tabii, quick sort algorştması sıralanabilen her veri tipine uygulanabilir. Aşağıda, algoritmanın string tipi verilere uygulanışına bir örnek verilmiştir. // package hızlısıralama; import java.util.arrays; public class QuickSortString { String[] str = { "Kars", "Zonguldak", "Ankara", "Denizli", "Manisa", "Giresun", "Erzurum", "Hakkari" ; void qsortstr(string a[], int min, int max) { int altindis = min; int üstindis = max; String mid; if (max > min) { // mihenk (pivot) terimi bulunuyor mid = a[(min + max) / 2]; // isdisler çakışana ya da çapraz olana kadar döngü sürüyor while (altindis <= üstindis) { * Soldan başlayarak, mihenkten küçük olanlara dokunmadan geç * mihenk'e eşit ya da büyük olanı bulunca dur ve bekle while ((altindis < max) && (a[altindis].compareto(mid) < 0)) * Sağdan başlayarak, mihenkten büyük olanlara dokunmadan geç * mihenk'e eşit ya da küçük olanı bulunca dur ve bekle while ((üstindis > min) && (a[üstindis].compareto(mid) > 0)) alt diziyi alt diziyi // Eğer altindis <= üstindis ise takas yap if (altindis <= üstindis) { String t = a[üstindis]; a[üstindis] = a[altindis]; a[altindis] = t; * Eğer üstindis arrayin sol ucuna erişmediyse soldaki * ayrıştır if (min < üstindis) qsortstr(a, min, üstindis); * Eğer altindis arrayin sağ ucuna erişmediyse sağdaki 6

* ayrıştır if (altindis < max) qsortstr(a, altindis, max); public static void main(string[] args) { QuickSortString qs = new QuickSortString(); System.out.println("Sıralamadan önce: "); System.out.println(Arrays.toString(qs.str)); qs.qsortstr(qs.str, 0, 7); System.out.println("\nSıralamadan sonra:"); System.out.println(Arrays.toString(qs.str)); 7