2010-11-02 11 views
2

J'essaie de déclarer une fonction sort : real list -> int list * real list qui trie la liste en utilisant mergesort et retourne également une liste int avec les positions d'origine des différents numéros pré-triés.Sauvegarde de l'index à partir d'une vraie liste

Peut-être que cet exemple sera plus facile à comprendre:

sort [5.4,7.2,1.5,9.6] = ([2,0,1,3], [1.5,5.4,7.2,9.6] 

Maintenant, le tri de la liste est assez facile, mais je vais avoir du mal à comprendre comment l'obtenir de se rappeler la position d'origine puis faites une liste int avec.

Aide?

Répondre

1
  1. Créer une liste de paires qui contient chaque élément de la liste originale avec son index (vous pouvez utiliser ListPair.zip avec une liste des indices (que vous pouvez créer avec List.tabulate), de le faire) .
  2. Trier cette liste. Utilisez ListPair.unzip pour transformer la liste triée de paires en une liste de listes.
+0

Comment créer cette liste d'index? – Newbie

+0

@Newbie: 'List.tabulate (longueur xs) (fn i -> i)' (où 'xs' est la liste que vous voulez trier). – sepp2k