数据结构-排序算法2

来源:互联网 发布:大商创开源破解版源码 编辑:程序博客网 时间:2024/05/16 05:01

2.2 交换排序
交换就是根据数据序列中两个元素关键字的比较结果来兑换两个记录在序列中的位置。
2.2.1 冒泡排序
冒泡排序算法的基本思想:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。
冒泡排序的空间复杂度为O(1),时间复杂度为O(n2),是一种稳定的排序算法。
冒泡排序示例图

    void Bubblesort(ElemType A[],int n)    {        for(i=0;i<n-1;i++)            flag=false;//表示本趟冒泡是否发生交换的标志            for(j=n-1;j>1;j--)//一趟冒泡排序的过程                if(A[j-1].key>A[j].key)//若为逆序                {                    swap(A[j-1],A[j]);//交换                    flag=true;                }            if(flag==false)                return;//本趟遍历后没有发生交换,说明已经有序    }

2.2.2 快速排序
快速排序的基本思想是基于分治法的:在待排序表L[1……n]中任意去一个元素pivot作为基准,通过一趟将待排序表划分为独立的两部分L[1……k-1]和L[k+1……n],使得L[1……k-1]中所有元素小于pivot,L[k+1……n]中所有元素大于或等于pivot,则pivot放在了其最终位置上,这个过程称作一趟快速排序,而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止。
快速排序示例图

    int Partition(ElemType A[],int low,int high)    {        ElemType pivoit=A[low];        while(low<high)        {            while(low<high&&A[high]>=pivot) --high;            A[low]=A[high];            while(low<high&&A[low]<=pivot) ++low;            A[high]=A[low];        }        A[low]=pivot;        return low;    }

2.3 选择排序
选择排序的基本思想是:每一趟在后面n=i+1个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟昨晚,待排序元素只剩下1个,就不用再选了。
2.3.1 简单选择排序
简单选择排序思想:假设排序表为L[1……n],第i趟排序即从L[1……n]中选取关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。
简单选择排序
2.3.2 堆排序
堆排序是一种树形选择排序方法,在排序过程中将L[1……n]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中的双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大或最小的元素。
2.4 归并排序
归并排序:假设待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为1,然后两两归并,得到n/2个长度为1或2的有序表,重复直到合并成一个长度为n的有序表未知,这种称之为2路归并排序。
这里写图片描述
2.5 基数排序
基数排序是采用多关键字排序的思想,借助“分配”和“收集”两种操作对单逻辑关键字进行排序。
这里写图片描述

原创粉丝点击