选择排序(4) 简单选择,堆排序

简单选择排序

1.思想
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
这里写图片描述
2.代码

#include<bits/stdc++.h>
using namespace std;
/***简单选择排序**/
 void selectSort(int arr[]) 
{ 
     for (int i = 0; i < 8-1; i++) 
     {    

         //每一趟循环比较时,min用于存放较小元素的数组下标
         /*
         这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,
         避免每次遇到较小元素都要进行交换。 
         */
         int min = i;
         for (int j = i + 1; j < 8; j++) 
         { 
            if (arr[j] < arr[min]) 
            {
              min = j; 
            }
         } 
        //进行交换,如果min发生变化,则进行交换 
        if (min != i) 
        { 
         swap(arr[min],arr[i]);
        } 
        /*****************输出************************/ 
        cout<<"第"<<i+1<<"次比较: " ; 
        for(int i=0;i<8;i++)
        {
            cout<<arr[i]<<" ";
        }
         cout<<endl;
       /*****************************************/ 
     }
}
int main()
{
    int arr[8]={9,0,6,7,1,5,4,8};
    selectSort(arr);
}

这里写图片描述
3.性能

这里写图片描述

堆排序

1.思想
完全二叉树:
 若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。
 步骤:
1.)构造堆
2.)交换堆得末尾元素和根结点
3.)删除末尾结点
4.)依次循环
因为根结点是堆中最大或最小的元素(取决于构造的是大顶堆还是小顶堆),所以删除得到的序列必是有序的。

堆排序详解http://www.cnblogs.com/jingmoxukong/p/4303826.html

2.代码

#include<bits/stdc++.h>
using namespace std;
/***堆排序**/

     /********堆筛选调整*******/
void HeapAdjust(int array[], int parent, int length) 
{
    int temp = array[parent]; //temp保存当前父节点
    int child = 2 * parent + 1; //先获得左孩子
    while (child < length) 
    {
        //如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
        if (child + 1 < length && array[child] < array[child + 1]) 
        {   
            child++;
        }

        //如果父结点的值已经大于孩子结点的值,则直接结束
        if (temp >= array[child])
            break;

        //把孩子结点的值赋给父结点
        array[parent] = array[child];

        //选取孩子结点的左孩子结点,继续向下筛选
        parent = child;
        child = 2 * child + 1;
    }
    array[parent] = temp;
}

/***************************************************/   
 //堆排序主要算法 
void heapSort(int list[],int length) 
{
    //循环建立初始堆
    for (int i = length/ 2; i >= 0; i--) 
    {
        HeapAdjust(list, i, length);
    }
    //进行n-1次循环,完成排序
    for (int i = length-1; i > 0; i--) 
    {
        //最后一个元素和第一元素进行交换
        int temp = list[i];
        list[i] = list[0];
        list[0] = temp;

        //筛选R[0]结点,得到i-1个结点的堆
        HeapAdjust(list, 0, i);
        /********每轮后输出*******/
        cout<<"第"<<length-i<<"趟: "; 
         for (int i = 0; i <length; i++) 
        {
            cout<<list[i]<<" ";

        }
        cout<<endl;
    }
}
/************************************************/
int main()
{
    int array[]={1,3,4,5,2,6,9,7,8,0};
    int n=sizeof(array)/sizeof(int);
    heapSort(array,n);
    //通过根堆建立完毕后:9 8 6 7 2 1 4 3 5 0 
}

这里写图片描述

3.性能

猜你喜欢

转载自blog.csdn.net/zhaoshuling1109/article/details/80586429