面試和筆試中,排序演算法很容易考到,所以簡單複習了一下資料結構中的排序演算法,資料結構這本書中有一章講的是排序,大都給出了虛擬碼,有了虛擬碼就很容易實現了。其實很多機試題,例如:數字題,只要看出了其中的數字規律,就很容易上機實現,如果沒看出來,那就會被難住了。再一次證明,思想很重要,只要理解了演算法,頭腦中對此種演算法的執行過程很清晰,就不怕代碼實現不了
好了,廢話不多說了,下面就結合書中的虛擬碼,給出樣本
#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來釋放空間
上例中只是給出了幾種容易實現的排序演算法,像堆排序和歸併排序等排序演算法,實現起來有點複雜,堆排序是個遞迴的過程,堆是一個完全二叉樹,在輸出節點後,需要動態刪除此節點,然後重新讞整堆。這些排序演算法好像出現的機率沒有樣本中列出的幾種排序演算法機率大,所以後面有時間再看看吧