排序算法(三)

来源:互联网 发布:mysqldump 指定数据库 编辑:程序博客网 时间:2024/06/07 03:16

选择排序首先就是找到数组中最小的那个元素,然后将其与数组中的第一个元素交换位置;接着在剩余的元素中找到最小的元素,将其与第二个元素交换位置。如此往复,直到将针整个数组排序。其实就是不断的在剩余数组中找最小的元素。所以它的运行时间和输入无关,它的移动也是最少的


选择排序

时间复杂度O(n^2),空间复杂度O(1),不稳定!

选择和冒泡的区别:选择是每次遍历未排序的数组,选出最小或最大的值,将其放在未排序的头或尾位置,而冒泡是每次遍历数组,两两比较相邻的值,并对未排序的进行交换,最终将当前的最大或最小的值放在未排序的头或尾位置。

void SelectionSort(int a[], int n){    for (int i = 0; i < n - 1; i++)         // i为已排序序列的末尾    {        int min = i;                        //将未排序的末尾的值赋给a[min]        for (int j = i + 1; j < n; j++)     // 未排序序列        {            if (a[j] < a[min])              // 找出未排序序列中的最小值            {                 min = j;                     }        }        if (min != i)        {            int temp = a[min];            a[min] = a[i];            a[i] = temp;        }}


堆排序


https://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html


这里说的堆是指的一种数据结果,这个数据结果其实就是完全二叉树,对于完全二叉树,则除了叶子结点,别的结点都是由两个孩子的,分别是左孩子和右孩子,如果一个节点为i,则它的左孩子为2i+1,右孩子为2i+2。如果不理解可以看上面那个博客!它对整个过程作了详细的说明。
时间复杂度O(nlogn),空间复杂度 O(1),是不稳定的!

void Heapify(int a[],int i,int size){   //从a[i]向下进行堆调整int left_child = 2*i+1;    //左孩子的索引int right_child = 2*i+2;   //右孩子的索引int max = i;       //先认为i为最大的值,然后与左右孩子比较,选出最大值if(left_child < size && a[left_child] > a[max])max = left_child;if(right_child < size && a[right_child] > a[max])max = right_child;if(max != i){int temp = a[i];a[i] = a[max];a[max] = temp;Heapify(a,max,size);   //通过递归调用,调整堆,在该代码中,是建立最大堆}}int BuildHeap(int a[],int n){   //建堆int heap_size = n;for(int i = heap_size/2 - 1; i >= 0; i--)  //从每一个非叶子结点开始往下调整Heapify(a,i,heap_size);return heap_size;}void HeapSort(int a[],int n){     int heap_size = BuildHeap(a,n);   //建立一个最大堆while(heap_size > 1){   //堆元素大于1,说明还没有完成排序int temp = a[0];    //将堆定元素和最后一个元素进行交换,并且在堆中去掉最后一个元素a[0] = a[--heap_size];a[heap_size] = temp;Heapify(a,0,heap_size);   //对新堆进行自顶而下的调整,形成最大堆}}



原创粉丝点击