排序之选择类排序

1.简单选择排序

//简单选择排序

    void SelectSort(int R[],int n)

    {

        int i,j,cur;

        for(i=1;i<=n;i++){

            cur=i;

            for(j=i+1;j<=n;j++){

                if(R[j]<R[cur])

                    cur=j;

            }

            swap(R[i],R[cur]);

        }

    }

2.堆排序


  


  //对以i作为根的树进行调整,只能保证i调整路径上的节点大小有序

    void Sift(int R[],int low,int high)

    {

        int i=low,j=2*low;

        while(j<high)

        {

            //j<high目的j+1<=high,锁定其较大的孩子进行交换

            if(j<high&&R[j]<R[j+1])

                j++;

            //如果当前节点小于子节点

            if(R[i]<R[j])

            {

                swap(R[i],R[j]);//将父节点与比他大的孩子进行交换

                i=j;//父节点到了孩子的地方,i随之变化

                j=2*i;//j表示新的左孩子节点

            }else//如果目节点大于最大的孩子,则结束

                break;

        }

    }

    //堆排序

    void HeapSort(int R[],int n)

    {

         //建立初始堆

         for(int i=n/2;i>=1;i--)

             Sift(R,i,n);

        for(int i=n;i>=2;i--)

        {

            //将堆的最大值置尾

            swap(R[i],R[1]);

            //对堆进行调整,并缩减堆的规模

            Sift(R,1,i-1);

        }

    }

猜你喜欢

转载自blog.csdn.net/lmyaxx/article/details/82762137