内部並べ替え

11260 ワード

暇があっても大丈夫です.データ構造の内部並べ替えを復習して、午後の時間を利用して、適当に選択、快速並べ替え、内部並べ替えの実現を書きました.ここにコードを貼り付けます.自分の連絡先として使うだけです.
      
public class Program {



    public static void main(String[] args) {

        // TODO Auto-generated method stub

          

           int[] array = CreateRandomArray(20);

           Display(array);

           SelectSortClass.Sort(array);

           Display(array);

           QuickSortClass.Sort(array);

           Display(array);

           HeapSortClass.Sort(array);

           Display(array);

    }

    

    

    private static int[] CreateRandomArray(int n)

    {

        int[] array = new int[n];

        Random rnd = new Random();

        for(int i = 0;i<n;i++)

        {

            array[i] = rnd.nextInt(n*10);

        }

        return array;

    }

    

    private static void Display(int[] array)

    {

        for(int i =0;i<array.length;i++)

        {

            System.out.print(array[i] + "  ");

        }

        System.out.println();

        

    }

    

}
並べ替えを選択すると次のようになります.
public class SelectSortClass

{

       public static void Sort(int[] array)

    {

        for(int i = 0;i < array.length;i++)

        {

            int minIndex = i;

            for(int j = i +1;j<array.length;j++)

            {

                 if(array[minIndex] > array[j])

                       minIndex = j ;

            }

            if(minIndex != i)

            Swap(array,minIndex,i);

        }

    }



    private static void Swap(int[] array,int m,int n)

    {

         int temp = array[m];

         array[m] = array[n];

         array[n] = temp;

    }



}
クイックソートの実現は以下の通りです.
public class QuickSortClass 

{



    /**

     *     

     * @param array

     * @param left

     * @param right

     */

    public static void Sort(int[] array)

    {

        QuickSort(array,0,array.length -1);

    }

    

    private static void QuickSort(int[] array,int left,int right)

    {

        if(left<right)

        {

            int partion = Division(array,left,right);

            QuickSort(array,left,partion-1);

            QuickSort(array,partion +1 ,right);

        }

        

    }

    

    private static int Division(int[] array,int left,int right)

    {

        int temp = array[left];

        while(left < right)

        {

            while(left < right && temp <= array[right])

                right--;

            array[left] = array[right];

            while(left < right && temp >= array[left])

                left++;

            array[right] = array[left];

        }

        array[left] = temp;

        return left;

    }

}
積み上げ順序の実現は以下の通りである.
public class HeapSortClass {



    /**

     *    

     * @param array

     */

    public static void Sort(int[] array)

    {

        BuildMaxHeap(array); //     

        for(int i = array.length - 1;i>=0;i--)

        {

            Swap(array,0,i);//

            MaxHeapUpdate(array,0,i);// i        

        }

    }

    

    private static void BuildMaxHeap(int[] array)

    {

           for(int i = (array.length / 2) -1; i >= 0; i--)

           {

               MaxHeapUpdate(array,i,array.length);

           }

    }

    

    private static void MaxHeapUpdate(int[] array ,int i,int heapSize)

    {

        int left = i* 2;

        int right = i* 2 +1;

        int max = i;

        if(right < heapSize)

        {

             if(array[left] >= array[right])

             {

                 if(array[left] > array[i])

                     max = left;

             }

             else

             {

                 if(array[right] > array[i])

                     max = right;

             }

        }

        if(max != i)

        {

            Swap(array,max,i);

            MaxHeapUpdate(array,max,heapSize);

        }

    }

    

    private static void Swap(int[] array,int m,int n)

    {

         int temp = array[m];

         array[m] = array[n];

         array[n] = temp;

    }

    

}