Ja na pierwszym roku studiów musiałem chyba około 3 razy napisać wyszukiwanie binarne na różnego rodzaju laboratoriach poczynając od podstawach programowania, a kończąc na Algorytmach i strukturach danych. Także myślę, że ktoś może z tego przykładu skorzystać. Dodam tylko, że wyszukiwanie binarne można rozwiązać w sposób rekurencyjny. Dość naturalny do wyobrażenia w tym przypadku. Kod poniżej prezentuje właśnie to podejście.
Co do samego algorytmu jak zawsze nie będę się przemęczał (nie dlatego, że mi się nie chce, ale inni opisali go już setki razy)
publicclass BinarySearch {publicstaticint tab[]={3,5,12,20,28,34,38,41,55,67,71,78,81,85,94,99,102};//funkcja zwraca indeks elementu, jeśli go nie ma zwróci -1publicstaticint binSearch(int find,int left,int right){//System.out.println("Szukam "+find+" lewy: "+left+" a prawy: "+right);int index=(left+right)/2;if(tab[index]==find){return index;}else{if(left>right){//System.out.println("Nie ma takiej liczby!");return-1;}else{if(tab[index]<find){return binSearch(find,index+1,right);}else{return binSearch(find,left,index-1);}}}}publicstaticvoid main(String[] args){System.out.println(binSearch(67,0,16));}}
Hej, dzisiaj zaliczyłem ostatni przedmiot, kurs. Także sesja GAME OVER czytaj. „Mission Accomplished”. Tekst rodem z RED ALERT.
Zapewne wrzucę jeszcze kilka swoich kodów na stronkę. Dzisiaj sortowanie przez kopcowanie zaimplementowane obiektowo. Struktura kopca zupełnego znajduje się w pliku heap.java, a jego przykładowe zastosowanie (tutaj sortowanie) w pliku test.java.
tym razem oddaję w wasze ręce binarne drzewo poszukiwań. Pisząc kod korzystałem z książki „Algorytmy od podstaw” więc siłą rzeczy kod jest podobny. Jeśli dopiero zaczynacie zabawę z drzewami pomocny może być aplet pod tym adresem.
Główne klasy to:
drzewo - BSTree: insert(), delete(),search(),preOrder(),inOrder(),postOrder();
pojedyńczy węzeł - Node: min(),max(),succ(),pred(),height();
Hej! Na drugim semestrze realizuję kurs „Algorytmu i struktury danych”, pomyślałem, że dla potomnych będę wrzucał kody źródłowe swoich programów. Dużo mówi się też o wzorcach projektowych, więc z pewnością tutaj zagoszczą. Dzisiaj oddaję do waszej dyspozycji listę jedno kierunkową z głową + dodawanie/ usuwanie ostatniego elementu za pomocą ogona.
publicclassLinkedList{//zmienne składoweprivate Link head;// głowa listyprivate Link tail;// ogon listy, wykorzystywany do dodawania i usuwania z konca listyprivateint size=0;// liczba elementów aktualnie przechowaywanych na liście//konstruktorpublicLinkedList(){
head =new Link();
tail = head;}//dodaj element na początkupublicvoid addFirst(Object ob){
Link temp =new Link(head.element,head.next);
head.element=ob;
head.next=temp;
size++;
tail = get(size+1);}//dodaj element na końcu - za pomocą ogonapublicvoid addOnTail(Object ob){
tail.element= ob;
tail.next=new Link();
tail = tail.next;
size++;}//dodaj element na końcu - sposób bez ogonapublicvoid addLast(Object ob){if(size==0){
addFirst(ob);}else{
Link last = get(size+1);
last.element= ob;
last.next=new Link();
tail = last.next;
size++;}}//zwraca węzęł o podanym numerzeprivate Link get(int index){
Link temp=head;for(int i=0;i<index-1;i++)
temp = temp.next;return temp;}//zwraca elementpublicObject getEl(int index){
Link temp=head;for(int i=0;i<index-1;i++)
temp = temp.next;return temp.element;}//wyszukaj elementu zwraca numer elementu na liście, jeśli go nie ma -1publicint find(Object ob){
Link temp;for(int i=1;i<=size;i++){
temp = get(i);if((temp.element).equals(ob))return i;}return-1;}//usuń pierwszy elementpublicvoid delFirst(){ head=head.next; size--;}//usuń ostatnij elementpublicvoid delLast(){ tail=get(size); get(size-1).next=tail; tail.next=null; size--;}//usuń wybrany elementpublicboolean del(Object ob){int number = find(ob);if(number!=-1){if(number>1&& number<size){
Link temp_left = get(number-1);
temp_left.next=get(number+1);
size--;returntrue;}else{if(number==1){
delFirst();returntrue;}else{
delLast();returntrue;}}}elsereturnfalse;}//podaj rozmiar listypublicint size(){return size;}//zwróć pierwszy węzełpublic Link first(){return head;}//zwróć ostatnij węzeł - nie ogon!!!public Link last(){return get(size);}//toString()publicString toString(){String content ="";for(int i=1;i<=size;i++)
content += get(i).element+" ";return content;}}//Węzeł listyclass Link {Object element;
Link next;public Link(){this(null,null);}public Link(Object ob){this(ob,new Link());}public Link(Object ob, Link lnk){
element = ob;
next = lnk;}}
Oto przykładowe wykorzystanie listy. W tym wypadku pracujemy z obiektem klasy String, ale może być to zupełnie inna klasa zadeklarowana przez nas.
publicclass Test {publicstaticvoid main(String[] args){LinkedList lista =newLinkedList();System.out.println("Dodaje imie na poczatku:");
lista.addFirst("Piotr");System.out.println("- "+lista);System.out.println("Dodaje imie na poczatku:");
lista.addFirst("Marcin");System.out.println("- "+lista);System.out.println("Dodaje imie na końcu:");
lista.addOnTail("Ania");System.out.println("- "+lista);System.out.println("Usuwam imię 'Ania':");
lista.del("Ania");System.out.println("- "+lista);System.out.println("Na liscie znajduja sie "+lista.size()+" elementy");System.out.println("Sprawdzam czy na liscie jest imie 'Piotr'");String temp ="Piotr";if(lista.find(temp)!=-1)System.out.println("Imie znajduje sie na pozycji: "+lista.find(temp));elseSystem.out.println("Brak elementu");}}