排序之内部排序 选择式排序

选择式排序主要有两种:选择式排序和堆排序

一 选择式排序

package sort;

/**
 * 选择排序
 * @author myjava_024
 */
public class SelectSort {
 public static int [] a =  {10,32,1,9,5,7,12,0,4,3}; // 预设数据数组
 
 public static void main (String args[])
 {
  int i;    // 循环计数变量
  int Index = a.length;// 数据索引变量

     System.out.print("排序前 : ");
       for ( i=0 ; i<Index-1 ; i++ )
        System.out.print(" "+a[i]+" ");
  System.out.println("");
            
  SelectSort(Index-1);   // 选择排序
          // 排序后结果
     System.out.print("排序后: ");
       for ( i=0 ; i<Index-1 ; i++ )
        System.out.print(" "+a[i]+" ");
  System.out.println("");
 }
 
 
 public static void SelectSort(int Index)
 {
  int i,j,k;    // 循环计数变量
  int MinValue;   // 最小值变量
  int IndexMin;   // 最小值索引变量
  int Temp;    // 暂存变量

       for ( i=0 ; i < Index-1; i++ )
       {
        MinValue = 32767;  // 目前最小数值
       IndexMin = 0;   // 储存最小数值的索引值
           for ( j = i ; j < Index ; j++ )
           {
           if ( a[j] < MinValue ) // 找到最小值
           {
            MinValue = a[j]; // 储存最小值
           IndexMin = j;
                 }
                Temp = a[i];            // 交换两数值
                  a[i] = a[IndexMin];
                  a[IndexMin] = Temp;
           }

           System.out.print("目前排序结果 : ");
                 for (k=0;k<Index;k++)
                  System.out.print(" "+a[k]+" ");
              System.out.println("");
       }
 }
}

二 堆排序

package sort;

/**
 * 堆排序
 * @author myjava_024
 */
public class HeapSort {
public static int[] Heap = {10,32,1,9,5,7,12,0,4,3}; // 预设数据数组
 
 public static void main (String args[])
 {
  int i;        // 循环计数变量
  int Index = Heap.length; // 数据索引变量

     System.out.print("排序前 : ");
      for ( i=1 ; i<Index-1 ; i++ )
       System.out.print(" "+Heap[i]+" ");
  System.out.println("");
            
  HeapSort(Index-2); // 堆排序

     System.out.print("排序后 : ");
      for ( i=1 ; i<Index-1 ; i++ )
       System.out.print(" "+Heap[i]+" ");
  System.out.println("");
 }


    /**
     * 建立堆
     */
 public static void CreateHeap(int Root,int Index)
 {
  int i,j;    // 循环计数变量
  int Temp;    // 暂存变量
      int Finish;                   // 判断堆是否建立完成

      j = 2 * Root;                    // 子节点的Index
      Temp = Heap[Root];              // 暂存Heap的Root 值
      Finish = 0;                     // 预设堆建立尚未完成

      while ( j <= Index  &&  Finish == 0 )
      {               
   if ( j < Index )  // 找最大的子节点
         if ( Heap[j] < Heap[j+1] )
                j++;
   if ( Temp >= Heap[j] )
        Finish=1;  // 堆建立完成
         else
         {
       Heap[j/2] = Heap[j]; // 父节点 = 目前节点
              j=2*j;
          }
      }
      Heap[j/2] = Temp;   // 父节点 = Root值
 }


 public static void HeapSort(int Index)
 {
  int i, j, Temp;
          // 将二叉树转成Heap
     for ( i= (Index/2) ; i >= 1 ; i-- )
          CreateHeap(i,Index);

      // 开始进行堆排序
     for  ( i = Index-1; i >= 1; i--)
     {
      Temp = Heap[i+1];  // Heap的Root值和最后一个值交换
         Heap[i+1] = Heap[1];
         Heap[1] = Temp;
   CreateHeap(1,i);  // 对其余数值重建堆
         
   System.out.print("堆的处理过程 : ");
   for  ( j=1 ; j <= Index; j++ )
          System.out.print(" "+Heap[j]+" ");
   System.out.println("");
     }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值