none
Array aufteilen und sortieren RRS feed

  • Frage

  • Hallo,

    der folgende Code soll eigentlich die linke und die rechte Hälfte eines Arrays sortieren,

    damit beide Teilarrays schließlich das sortierte Gesamtarray ergeben. Jedoch stimmt am

    Ende das Ergebnis nicht. Der Grund für die beiden Methoden ist, dass diese von je einem Thread

    bearbeitet werden soll, damit die Performance verbessert wird. (ist Java-Code, sollte aber lesbar sein)

    Gruß Volker

     private synchronized int[] sortLeftPart(int[] array, int startIndex, int endIndex) {
            int length = endIndex - startIndex;
    		if(length == 0) {
    			return new int[]{};
    		}
    		if(length == 1) {
    			return new int[]{array[startIndex]};
            }
            int halfLength = length / 2;
            return sortLeftPart(array, startIndex, startIndex + halfLength);
          }
    
          private synchronized int[] sortRightPart(int[] array, int startIndex, int endIndex) {
            int length = endIndex - startIndex;
    		if(length == 0) {
    			return new int[]{};
    		}
    		if(length == 1) {
    			return new int[]{array[startIndex]};
            }
            int halfLength = length / 2;
            return sortRightPart(array, startIndex + halfLength, endIndex);
          }

    hier der code zum zusammenfuehren:

    private static int[] merge(int[] lhs, int[] rhs) {
    		int[] result = new int[lhs.length + rhs.length];
    		
    		int leftIndex = 0;
    		int rightIndex = 0;
    		while(leftIndex < lhs.length && rightIndex < rhs.length) {
    			if(lhs[leftIndex] <= rhs[rightIndex]) {
    				result[leftIndex + rightIndex] = lhs[leftIndex];
    				leftIndex++;
    			} else {
    				result[leftIndex + rightIndex] = rhs[rightIndex];
    				rightIndex++;
    			}
    		}
    		
    		while(leftIndex < lhs.length) {
    			result[leftIndex + rightIndex] = lhs[leftIndex];
    			leftIndex++;
    		}
    		
    		while(rightIndex < rhs.length) {
    			result[leftIndex + rightIndex] = rhs[rightIndex];
    			rightIndex++;
    		}
    		
    		return result;
    	}

    Samstag, 7. Mai 2011 13:43

Antworten

  • Hi,

    der folgende Code soll eigentlich die linke und die rechte Hälfte eines Arrays sortieren,

    was soll denn eine linke und eine rechte Hälfte bei einem Array sein? Da gibts kein links und rechts.

    damit beide Teilarrays schließlich das sortierte Gesamtarray ergeben. Jedoch stimmt am

    Ende das Ergebnis nicht. Der Grund für die beiden Methoden ist, dass diese von je einem Thread

    Du willst zwei Arrays mergen und sortieren. Soll das Endergebnis "sortierte Elemente aus Array 1", danach "sortierte Elemente aus Array 2" sein oder einfach alle Elemente aus beiden Arrays und die sortiert?

    Falls letzteres, was sollte die eine Aufteilung dann bringen? Du musst ja eh alle Elemente hinterher wieder sortieren, da die nicht in Reihenfolge stehen.

    (ist Java-Code, sollte aber lesbar sein)

    Und was willst Du dann hier? Hier gehts nicht um Java. Soll dir jetzt jemand hier den Java Code umbasteln?

    In C# gibts viele Methoden, mit denen Du Arrays und andere Listen sortieren kannst. Such dir einfach die für dich passende aus.

      http://msdn.microsoft.com/de-de/library/system.array.sort.aspx

      http://msdn.microsoft.com/de-de/library/8k6e334t.aspx

      http://msdn.microsoft.com/de-de/library/b0zbh7b6.aspx

      http://msdn.microsoft.com/de-de/library/bb383982.aspx

      ...

    Dasselbe gilt auch für das Zusammenführen der Arrays (bzw. List, ...). Die Links findest Du aber selbst, wenn Du die o.g. Links verfolgst.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert deppensido Samstag, 7. Mai 2011 14:23
    Samstag, 7. Mai 2011 14:06
    Moderator