8.4 选择排序

简单选择排序的思想

从后续的序列找出最小的元素然后交换

void SelectSort(int A[],int n){
    int i,j;
    int temp;
    for(i = 0;i < n-1;i++){
        int min = i;
        for(j = i+1;j < n-1;j++){
		if(A[i] > A[j]){
            min = j;
        }
        }
        Swap(A[i],A[j]);
    }
}

属于不稳定的算法


堆排序

算法思想:

数组被排序成大根堆或者小根堆

大根堆:类似完全二叉树的排布,n/2向下取整的结点为非叶子结点,根节点的值大于左右结点的值

语言描述:

逐个排查n/2的结点,然后根据左右结点为i/2和i /2+1的结点进行比对,看是否满足大根堆的要求

直到满足为止

代码实现:

	void BuildMaxHeap(int A[],int n){
        for(int i = n/2;i > 0;i--){
            HeadAdjust(A,i,n);
        }
    }

	void HeadAdjust(int A[],int k,int n){
        A[0] = A[k];
        for(int i = k*2;i < n;i *= 2){
            if(A[i+1] > A[i])
                i = i+1;
            if(A[0]>A[i])
                break;
            else{
                A[k] = A[i];
                k = i;
            }
        A[k] = A[0];
    }
     void HeadSOrt(int A[],int n){
         BuildMaxHeap(A);
         int i;
         for(i = n;i >= 0;i--){
             Swap(A[i],A[1]);
             HeadAdjust(A,1,i-1);
        
         }
     }

在实现排序完成后,需要将堆顶元素和堆底元素互换,然后排除已经排序的序列,然后重新对堆顶元素进行排序

时间复杂度为O(nlog2n)

堆排序不稳定

堆的插入和删除

堆的插入,需要插入表尾,然后根据对比父节点,如果比父节点小,则进行交换,直到父节点比该结点小为止

堆的删除,用堆底的元素代替,然后进行下调

猜你喜欢

转载自blog.csdn.net/weixin_43771775/article/details/111313763
8.4