高速ソートの実装
【2020休日復習】
データのセット
3 5 8 1 2 6 9 4 7 6
高速ソートが期待されるプロセスは、次のとおりです.(最終インデックスをpivotとします)
①3 5 8 1 2 6 9 4 7 6②3 5 4 4 1 2 6 8 6//交換8、4③3 5 4 1 2 6 8 9//交換9、6④交換3 5 4 4 1 2 6結果は変わらない⑤交換3 5 4 4 1 2 5 4 4 4 4 3 3//交換3、1 1 2 4 5//交換5、2⑥start sort:1 start sort:4 3 5 start sort:4 3 3 3 3 4 4//交換4、3
start sort:4⑦start sort:8 7 9 start sort:8 7 7 8//交換8、7
start sort : 8 result is: 1 2 3 4 5 6 6 7 8 9
実装は次のとおりです(同じvalueの相対順序は変更されません).
データのセット
3 5 8 1 2 6 9 4 7 6
高速ソートが期待されるプロセスは、次のとおりです.(最終インデックスをpivotとします)
①3 5 8 1 2 6 9 4 7 6②3 5 4 4 1 2 6 8 6//交換8、4③3 5 4 1 2 6 8 9//交換9、6④交換3 5 4 4 1 2 6結果は変わらない⑤交換3 5 4 4 1 2 5 4 4 4 4 3 3//交換3、1 1 2 4 5//交換5、2⑥start sort:1 start sort:4 3 5 start sort:4 3 3 3 3 4 4//交換4、3
start sort:4⑦start sort:8 7 9 start sort:8 7 7 8//交換8、7
start sort : 8 result is: 1 2 3 4 5 6 6 7 8 9
実装は次のとおりです(同じvalueの相対順序は変更されません).
import java.io.*;
import java.util.*;
class FastSort
{
public static void main(String[] args) throws Exception {
int[] array={3,5,8,1,2,6,9,4,7,6};
sort(array,0,array.length-1);
println(array);
}
private static void println(int[] arr)
{
for(int i:arr)
System.out.print(" "+i);
System.out.println();
}
public static boolean sort(int[] src,int leftArg,int rightArg) throws Exception
{
System.out.println("start sort :");
println(src);
if(src.length==1)
return true;
if(leftArg>=src.length-1||rightArgpivot
{
// right;
while(right>left)
{
int rightValue=array[right];
if(rightValue>=pivot)
right--;
else break;
}
if(right<=left)
{
// leftvalue pivot
int leftValue=array[left];
array[left]=pivot;
array[array.length-1]=leftValue;
System.out.print("switch left with pivot");
println(array);
//0~ left-1
int[] leftArray=new int[left];
System.arraycopy(array,0,leftArray,0,left);
if(!sort(leftArray,0,leftArray.length-2))
throw new Exception("left array sorted failed !"+ leftArray);
//left+1 ~ end
int[] rightArray=new int[array.length-left-1];
System.arraycopy(array,left+1,rightArray,0,array.length-left-1);
if(!sort(rightArray,0,rightArray.length-2))
throw new Exception("left array sorted failed !"+ rightArray);
System.arraycopy(leftArray,0,src,0,leftArray.length);
System.arraycopy(rightArray,0,src,left+1,rightArray.length);
src[left]=array[left];
System.out.print("result is ");
println(src);
return true;
}else
{
//rightValue