面试和笔试中,排序算法很容易考到,所以简单复习了一下数据结构中的排序算法,数据结构这本书中有一章讲的是排序,大都给出了伪代码,有了伪代码就很容易实现了。其实很多机试题,例如:数字题,只要看出了其中的数字规律,就很容易上机实现,如果没看出来,那就会被难住了。再一次证明,思想很重要,只要理解了算法,头脑中对此种算法的执行过程很清晰,就不怕代码实现不了
好了,废话不多说了,下面就结合书中的伪代码,给出示例
#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){ //长度大于1 pos=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来释放空间
上例中只是给出了几种容易实现的排序算法,像堆排序和归并排序等排序算法,实现起来有点复杂,堆排序是个递归的过程,堆是一个完全二叉树,在输出节点后,需要动态删除此节点,然后重新谳整堆。这些排序算法好像出现的概率没有示例中列出的几种排序算法概率大,所以后面有时间再看看吧