cyberops Posted May 18, 2008 at 12:32 PM Report Share #185816 Posted May 18, 2008 at 12:32 PM boas, estes algoritmos sao por natureza instaveis (nao preservam a ordens das chaves repetidas ). alguem tem alguma ideia como por isto estavel? obrigado desde já Link to comment Share on other sites More sharing options...
pedrotuga Posted May 18, 2008 at 12:56 PM Report Share #185823 Posted May 18, 2008 at 12:56 PM Quando comparas dois elementos usa a ordem das chaves como segundo critério de comparação caso os elementos sejam iguais. Link to comment Share on other sites More sharing options...
Rui Carlos Posted May 18, 2008 at 07:56 PM Report Share #185919 Posted May 18, 2008 at 07:56 PM No caso do quicksort é fácil tornar a implementação estável (aliás, não o considero por natureza instável, depende da implementação). Basta utilizar como pivot o primeiro elemento, e separar o resto em menores, e maiores ou iguais, mantendo a ordem. É claro que escolher sempre este elemento como pivot não é boa opção... Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Warrior Posted May 18, 2008 at 11:34 PM Report Share #185990 Posted May 18, 2008 at 11:34 PM Visto a maior parte das linguagens de relativo alto-nível fornecem algum modo de usar estes algoritmos sem os termos de escrever, a solução mais vezes usada é alterar a função de comparação para o caso de empate Link to comment Share on other sites More sharing options...
Rui Carlos Posted May 19, 2008 at 08:57 AM Report Share #186015 Posted May 19, 2008 at 08:57 AM Visto a maior parte das linguagens de relativo alto-nível fornecem algum modo de usar estes algoritmos sem os termos de escrever, a solução mais vezes usada é alterar a função de comparação para o caso de empate Isso pode não ser suficiente... Por exemplo, há implementações do quicksort que para escolherem o pivot, trocam um elemento de uma posição aleatória do vector a ordenar, com o último elemento, o que faz desde logo com que o algoritmo não seja estável. A forma como se trocam os elementos de posição também influencia. Mais uma vez, há implementação em que vamos percorrendo o array das extremidades para o centro, e procurando elemento menores/maiores do que o pivot no "início"/"fim" do array, e quando são necessárias trocas, os elementos que passam do início para o fim que apareceram primeiro, passam a aparecer em último e vice-versa. Não sei como é que as funções estão implementadas nas várias linguagens, mas a função de ordenação pode não ser suficiente, tudo depende da implementação do algoritmo. E sobretudo em linguagens do nível do C, a optimização do algoritmo incentiva a não o implementar de forma estável. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
mogers Posted May 19, 2008 at 04:57 PM Report Share #186098 Posted May 19, 2008 at 04:57 PM Eu acho que o Warrior pensou no mesmo que eu: adicionar o indice original do elemento no vector e em caso de igualdade usar esse indice original para desempatar (na função de comparação). "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Warrior Posted May 19, 2008 at 07:02 PM Report Share #186144 Posted May 19, 2008 at 07:02 PM Isso não influencia Rua Carlos, seja qual for o método usado, se mudares a função de comparação para não existirem igualdades os elementos irão aparecer ordenados no final. Link to comment Share on other sites More sharing options...
Rui Carlos Posted May 19, 2008 at 07:19 PM Report Share #186147 Posted May 19, 2008 at 07:19 PM A menos que se guarde a posição original do valor (tal como o mogers sugeriu, o que não me parece muito prático), não estou a ver onde irias buscar a informação que precisarias na função de ordenação, de modo a que tal não dependesse da implementação. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Warrior Posted May 19, 2008 at 07:52 PM Report Share #186154 Posted May 19, 2008 at 07:52 PM É exactamente isso que normalmente se faz, e é bastante prático. Link to comment Share on other sites More sharing options...
cyberops Posted May 21, 2008 at 04:17 PM Author Report Share #186481 Posted May 21, 2008 at 04:17 PM A menos que se guarde a posição original do valor (tal como o mogers sugeriu, o que não me parece muito prático), não estou a ver onde irias buscar a informação que precisarias na função de ordenação, de modo a que tal não dependesse da implementação. pois, foi essa soluçao q encontrei. usando programacao orientada a objectos torna-se bastante simples, o problema é q aumenta a complexidade pq no final temos q percorrer o array todo e para grandes quantidades de dados existe o prob adicional de memoria Link to comment Share on other sites More sharing options...
mogers Posted May 21, 2008 at 09:52 PM Report Share #186566 Posted May 21, 2008 at 09:52 PM o problema é q aumenta a complexidade pq no final temos q percorrer o array todo Se usares uma função de comparação como já foi aqui sugerido ou definires o operador menor da classe/struct, não tens este problema. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now