数据结构中的排序算法

来源:互联网 发布:360数据恢复软件下载手机 编辑:程序博客网 时间:2024/05/20 22:38

面试和笔试中,排序算法很容易考到,所以简单复习了一下数据结构中的排序算法,数据结构这本书中有一章讲的是排序,大都给出了伪代码,有了伪代码就很容易实现了。其实很多机试题,例如:数字题,只要看出了其中的数字规律,就很容易上机实现,如果没看出来,那就会被难住了。再一次证明,思想很重要,只要理解了算法,头脑中对此种算法的执行过程很清晰,就不怕代码实现不了

好了,废话不多说了,下面就结合书中的伪代码,给出示例

#include <iostream>using namespace std;//直接插入排序void straightsort(int list[],int n){int i,j;for(i=2;i<n;i++){list[0]=list[i];//list[0]设为哨兵,第一个值只用于比较,不存储j=i-1;while(list[0]<list[j]){list[j+1]=list[j];//记录后移j--;}list[j+1]=list[0];//将第i个记录插入到正确位置}}//冒泡排序void bubblesort(int list[],int n){int i,j,flag,temp;for(i=n-1;i>0;i--){flag=1;for(j=0;j<i;j++){if(list[j]<list[j+1]){//把最小的数据交换到最末端flag=0;temp=list[j];//交换记录list[j]=list[j+1];//从大到小排序list[j+1]=temp;}}if(flag)return;}}//一趟快排int quickpass(int list[],int low,int high){int pivotkey=list[low];//用子表的第一个记录作枢轴记录while(low<high){//从表的两端交替向中间扫描while(low<high && list[high]>=pivotkey){--high;}list[low]=list[high];//将比枢轴记录小的记录移动到低端while(low<high && list[low]<=pivotkey){++low;}list[high]=list[low];//将比枢轴记录大的记录移动到高端} list[low]=pivotkey; //枢轴记录到位return low;   //返回枢轴位置}//快速排序void quicksort(int list[],int low,int high){int pos;if(low<high){ //长度大于1pos=quickpass(list,low,high); //将list[low..high]一分为二quicksort(list,low,pos-1);  //对低子表递归排序,pos是枢轴位置quicksort(list,pos+1,high); //对高子表递归排序}}//简单选择排序void selectsort(int list[],int n){int i,k,j,temp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){ //选择最小记录的位置if(list[j]<list[k]){k=j;}}if(k!=i){temp=list[i];//将最小的记录交换到最前面list[i]=list[k];list[k]=temp;}}}void main(){int data[]={1,3,5,8,6,2,4};//测试数据int n=7;//straightsort(data,n);//bubblesort(data,n);//quicksort(data,0,n-1);selectsort(data,n);for(int i=0;i<n;i++){cout<<data[i]<<" ";}}


此例中,只是做了个简单测试,直接将数据放到数组中了,当然也可以由用户来实现,如果由用户来输入的话,需要用malloc来动态分配数组大小,或用C++中的vector来实现,如果用了malloc,需要用free来释放空间

上例中只是给出了几种容易实现的排序算法,像堆排序和归并排序等排序算法,实现起来有点复杂,堆排序是个递归的过程,堆是一个完全二叉树,在输出节点后,需要动态删除此节点,然后重新谳整堆。这些排序算法好像出现的概率没有示例中列出的几种排序算法概率大,所以后面有时间再看看吧