原陣列parr為[『a』,』b』,』c』,』d』,』e』],現在給定新位置ppos[3,0,1,4,2],要求只能採用交換的方式並按照新位置進行排序,要求空間複雜度為o(1)。排好序後的序列為
d a b e c.
如果不給限制條件這道題還是非常簡單的,現在給定了空間複雜度的限制為o(1),也就是說我們不能再原有陣列的基礎上再來開闢新的空間,這道問題就變得有些複雜了。
我們先給出問題的第一種解法,它利用了快速排序挖坑法的思想。
具體的步驟和演算法見下圖:
**如下:
void swapsort(vector
& parr,vector
& ppos)
else
}//最後一次填坑需要進行測試
if (index != ppos[index])
}
但是這種解法其實是有缺陷的,當我們給出的新位置的元素如果兩次如果是之前已經交換過的元素的下標,那麼排序就會出現問題,如我們給出ppos=[3 1 0 2 4]結果就會出現問題,因為當我們排道parr=[d b a c e]時,坑已經在正確的位置上了,所以才會導致我們後面填坑時又重新出現了a導致排序序列不正確。
為了防止parr中已經「坑」已經被放在正確位置又在後面重複填充,所以每次我們將坑填完後需要重新挖坑,新挖的坑為填坑後的下標出的第乙個index!=ppos[index]的下標,同時每次交換元素時我們要把當前下標更新為ppos裡的下標。
**如下:
void newswapsort(vector
&parr, vector
& ppos)
/*if (index == parr.size())
break;*/
//在index處挖坑
tmp = parr[index];
tmppos = index;
while (1)
//如果當前ppos中的下標與當前坑的下標不同
//則交換parr中ppos[index]中的元素給當前位置
parr[index] = parr[ppos[index]];
//更新ppos中的對應下標和當前下標
int j = ppos[index];
ppos[index] = index;
index = j;
counts++;
}else}}
}
交換排序演算法
快速排序 為啥叫快速排序,因為速度快,效率高 1.先找乙個數作為基準。作為基準的這個數,一趟排下來,左邊的數必小於它,右邊的數必大於它,也就是說,它找到了自己的位置。2.將兩個指標i,j分別指向表的起始 基準 和最後的位置。3.比較j指標的數字是否小於基準,j 直到j小於基準,交換位置 4.比較i指...
交換排序演算法
就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置。將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。氣泡排序 快速排序 說明 1.以下方法最後結果均按照公升序排列 2.用4,2,1,3,7,4,5,8,3,5序列進行測試 1 基本思想 在n個待排序陣列中選取待排序數...
排序演算法 交換排序
交換排序的基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時則進行交換,直到沒有反序的元素為止。1.氣泡排序 交換排序 演算法 氣泡排序 bubble sort 輸入 待排序元素的陣列,待排序元素個數 輸出 原理 通過無序區中相鄰元素間關鍵字的比較和位置的交換,使關鍵字最小的元素如氣泡一...