排序之選擇類排序
阿新 • • 發佈:2018-12-09
1.簡單選擇排序
//簡單選擇排序 void SelectSort(int R[],int n) { int i,j,cur; for(i=1;i<=n;i++){ cur=i; for(j=i+1;j<=n;j++){ if(R[j]<R[cur]) cur=j; } swap(R[i],R[cur]); } }
2.堆排序
//對以i作為根的樹進行調整,只能保證i調整路徑上的節點大小有序 void Sift(int R[],int low,int high) { int i=low,j=2*low; while(j<high) { //j<high目的j+1<=high,鎖定其較大的孩子進行交換 if(j<high&&R[j]<R[j+1]) j++; //如果當前節點小於子節點 if(R[i]<R[j]) { swap(R[i],R[j]);//將父節點與比他大的孩子進行交換 i=j;//父節點到了孩子的地方,i隨之變化 j=2*i;//j表示新的左孩子節點 }else//如果目節點大於最大的孩子,則結束 break; } } //堆排序 void HeapSort(int R[],int n) { //建立初始堆 for(int i=n/2;i>=1;i--) Sift(R,i,n); for(int i=n;i>=2;i--) { //將堆的最大值置尾 swap(R[i],R[1]); //對堆進行調整,並縮減堆的規模 Sift(R,1,i-1); } }