C++常用排序演算法 (轉)

gugu99發表於2007-08-17
C++常用排序演算法 (轉)[@more@]

//選擇排序法ionSort(int arr[],int n)
template
void SelectionSort(T arr[],int n)
{
 int smallIndex;  //表中最小元素的下標
 int pass,j;  //用來掃描子表的下標
 T temp;  //用來表元素的臨時變數

 //pass的範圍是0~n-2
 for (pass=0;pass {
 //從下標pass開始掃描子表
 smallIndex=pass;
 
 //j遍歷整個子表arr[pass+1]到arr[n-1]
 for(j=pass+1;j

 //如果找到更小的元素,則將該位置賦值給smallIndex
 if(arr[j] smallIndex=j;

 //如果smallIndex和pass不在相同的位置
 //則將子表中的最小項與arr[pass]交換
 if(smallIndex!=pass)
 {
 temp=arr[pass];
 arr[pass]=arr[smallIndex];
 arr[smallIndex]=temp;
 }
 }
}

/************************************************************************
雙端選擇排序演算法:是上面選擇排序演算法的變種,可以定位每個子表中最小和最大元素
並把它們分別放在子表的開頭和結尾.
************************************************************************/
//雙端選擇排序演算法deSelSort()的實現
template
void deSelSort(T arr[],int n)
{
 int smallIndex,largeIndex;  //表中最小及最大元素的下標
 int leass=0,rightPass=n-1,i,j;  //用來從表左邊及右邊掃描子表的下標
 T temp;  //用於交換元素的臨時變數
 
 while (leftPass<=rightPass)
 {
 //從左邊及右邊開始掃描子表
 smallIndex=leftPass;
 largeIndex=rightPass;
 
 //j和i遍歷整個子表arr[LeftPass]~arr[rightPass]
 for (i=leftPass+1;i //如果找到更小的元素,則將該位置賦值給smallIndex
 if (arr[i] smallIndex=i;

 //如果smallIndex和leftPass不在相同的位置
 //則將子表中的最小項與arr[pass]交換
 if (smallIndex!=leftPass)
 {
 temp=arr[leftPass];
 arr[leftPass]=arr[smallIndex];
 arr[smallIndex]=temp;
 }


 for (j=rightPass-1;j>leftPass;j--)
 if(arr[j]>arr[largeIndex])
 largeIndex=j;

 if(largeIndex!=rightPass)
 {
 temp=arr[rightPass];
 arr[rightPass]=arr[largeIndex];
 arr[largeIndex]=temp;
 }

 //從兩頭收縮子表
 leftPass++;
 rightPass--;
 }
}

//自編冒泡法排序演算法函式bubbleSort()的實現
template
int bubbleSort(T arr[],int n)
{
 bool d=false; //是否發生交換
 int i,j;  //用於遍歷子表的下標
 T temp;  //用於交換元素的臨時變數

 //開始遍歷過程,以下標j構成子表,共有n-1個子表
 for (j=n-1;j>=0;j--) //j從後往前收縮n-1~0,以構成子表0~n-1,0~n-2,0~n-3..0~1
 {
 exchanged=false;
 for (i=0;i {
 
 if (arr[i]>arr[i+1])
 {
 temp=arr[i];
 arr[i]=arr[i+1];
 arr[i+1]=temp;
 exchanged=true;
 }
 }
 if (!exchanged) return n-j-1;//如果在一次遍歷中沒有發生交換,則表示已經
  //排序好,中斷遍歷過程
 }
 return n-1-j;
}


//冒泡法排序一般演算法函式bubbleSortEx()的實現
template
int bubbleSortEx(T arr[],int n)
{
 int i,pass;  //用於遍歷子表的下標
 T temp;  //用於交換元素的臨時變數

 //開始遍歷過程,以下標j構成子表,共有n-1個子表
 for (pass=0;pass {
 for (i=0;i { 
 if (arr[i]>arr[i+1])
 {
 temp=arr[i];
 arr[i]=arr[i+1];
 arr[i+1]=temp;
 }
 }
 }
 return pass;
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章