pl / sql пузырьковая сортировка - PullRequest
3 голосов
/ 04 ноября 2010

хорошо, я бью себя за это. Мне нужно загрузить массив людей фамилию, хранящуюся в таблице. Затем отсортируйте фамилии и распечатайте их в алфавитном порядке. Это должно быть сделано с использованием алгоритма пузырьковой сортировки.

вот что у меня есть

CREATE OR REPLACE PROCEDURE TEAM_TABLE_SORT AS
  TYPE player_Name_type IS TABLE OF databasename.team.player%type
  INDEX BY PLS_INTEGER ;
  player_name player_Name_type;
  i integer := 1;
  temp integer;

BEGIN

  FOR player_names IN (SELECT * FROM marshall.team )
  LOOP
    player_name(i) := player_names.player;
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) || player_name(i) ) ;
    i := i + 1 ;
  END LOOP

Все, что на самом деле делает, это распечатывает имена. Я не могу заставить его сортировать. Я не пробую это

TYPE player_Name_type IS TABLE OF  %type INDEX BY varchar2(20) ;
aux player_Name_type;
i integer := 1;
v_current is table of aux
swapped BOOLEAN := TRUE;

BEGIN

  FOR aux IN (SELECT * FROM )
  LOOP
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) || aux.player);
    i := i + 1 ;
  END LOOP;

  v_current := aux.first;
  WHILE(swapped)
  LOOP
    swapped := FALSE;

    FOR I IN 1..(aux.count-2) LOOP
      IF aux(i) > aux(I+1) THEN
         v_current := aux(i+1);
         aux(I+1) := aux(i);
         aux(i) :=  v_current;
      END IF;
      swapped := TRUE;

    END LOOP;

  END LOOP;

FOR aux IN (SELECT * FROM    LOOP

  DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) ||aux.player);
  i := i + 1 ;
END LOOP;

Ответы [ 4 ]

7 голосов
/ 04 ноября 2010

Это должно быть то, что вы ищете. Обратите внимание, что лучше вводить переменные / коллекции из таблиц, как в вашем примере. Я просто использовал универсальные версии, так как у меня нет ваших таблиц для работы. Если вы не понимаете, как это работает, не стесняйтесь спрашивать. Я предполагаю, что это домашнее задание (кто еще будет разбираться в Oracle), поэтому цель задания - понять это, а не просто сделать это правильно. :)

DECLARE
  coll    DBMS_SQL.VARCHAR2A;
  swapped BOOLEAN;
  tmp     VARCHAR2(10);
BEGIN
  /*
    Generate 10 random strings and collect them into our collection
    Note: you would replace this with your query on marshall.team
  */
  select dbms_random.string('l',10) rand_string
  BULK COLLECT INTO coll
  from dual
  connect by level <= 10;


  /*
    At this point, all of the rows we need are in our collection
    so there is no need to go back to the table anymore.  Now onto the...

    Bubble sort.. walk through the collection swapping elements until
    we make a pass where no swapping takes place
  */
  LOOP

   swapped := false;

   FOR i IN 2 .. coll.LAST
   LOOP

     IF coll(i-1) > coll(i)
     THEN
       -- swap records
       tmp := coll(i);
       coll(i) := coll(i-1);
       coll(i-1) := tmp;

       /*
         Mark that swap has taken place.  note we mark as true only inside
         the if block, meaning a swap really did take place
       */ 
       swapped := true;

      END IF;

   END LOOP;

   -- If we passed through table without swapping we are done, so exit
   EXIT WHEN NOT swapped;

  END LOOP; 

  /*
    Now print out records to make sure they are in order.  Again notice
    how we are just referencing the (now sorted) collection and not going
    back to the table again
  */
  FOR i in coll.FIRST .. coll.LAST
  LOOP

    dbms_output.put_line(coll(i));

  END LOOP;

END;
/
2 голосов
/ 04 ноября 2010

Обычно вы хотите использовать ORDER BY в исходном запросе.

Вы можете также использовать индексную таблицу VARCHAR2 для выполнения сортировки.

DECLARE
  CURSOR c_1 is
     SELECT table_name, num_rows FROM user_tables order by num_rows;
  TYPE typ_tab IS TABLE OF c_1%rowtype INDEX BY user_tables.table_name%type;
  t_tab typ_tab;
  v_str user_tables.table_name%type;
BEGIN
  FOR c_rec IN c_1 LOOP
    t_tab(c_rec.table_name) := c_rec;
  END LOOP;
  v_str := t_tab.first;
  WHILE v_str IS NOT NULL LOOP
    dbms_output.put_line(t_tab(v_str).table_name||':'||t_tab(v_str).num_rows);
    v_str := t_tab.next(v_str);
  END LOOP;
END;
/
1 голос
/ 05 ноября 2010

Вы также можете использовать пример сортировки пузырьков в PL / SQL на этом сайте:

http://www.oratechinfo.co.uk/oo.html#bubble_sort

1 голос
/ 04 ноября 2010

Второй кусок кода, который вы опубликовали, выглядит как правильная реализация алгоритма пузырьковой сортировки. Причина, по-видимому, не работает, из-за этого последнего цикла. Вместо того, чтобы распечатывать отсортированный массив, вы заново заполняете его случайными данными из вашей таблицы.

Итак, просто измените последний цикл:

FOR i IN 1..aux.count()
LOOP    
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) ||aux(i).player);
END LOOP; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...