九章算法大廠高頻設(shè)計模式應(yīng)用及分析
void algorithm(int *array, int left, int right){
? ?
? ?if (left >= right) {/*如果左邊索引大于或者等于右邊的索引就代表已經(jīng)整理完成一個組了*/
? ? ? ?return ;
? ?}
? ?
? ?int i = left;
? ?int j = right;
? ?int key = array[left];
? ?
? ?while (i < j) { /*控制在當(dāng)組內(nèi)尋找一遍*/
? ? ? ?
? ? ? ?while (i < j && array[j] >= key) {/*而尋找結(jié)束的條件就是,1,找到一個小于或者大于key的數(shù)(大于或小于取決于你想升
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 序還是降序)2,沒有符合條件1的,并且i與j的大小沒有反轉(zhuǎn)*/
? ? ? ? ? ?j --;
? ? ? ?}
? ? ? ?array[i] = array[j];/*找到一個這樣的數(shù)后就把它賦給前面的被拿走的i的值(如果第一次循環(huán)且key是
? ? ? ? ? ? ? ? ? ? ? ? ? ? a[left],那么就是給key)*/
? ? ? ?
? ? ? ?while (i < j && array[i] <= key) {/*這是i在當(dāng)組內(nèi)向前尋找,同上,不過注意與key的大小關(guān)系停止循環(huán)和上面相反,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 因為排序思想是把數(shù)往兩邊扔,所以左右兩邊的數(shù)大小與key的關(guān)系相反*/
? ? ? ? ? ?i ++;
? ? ? ?}
? ? ? ?
? ? ? ?array[j] = array[i];
? ? ? ?
? ?}
? ?
? ?array[i] = key;/*當(dāng)在當(dāng)組內(nèi)找完一遍以后就把中間數(shù)key回歸*/
? ?//遞歸
? ?algorithm(array, left, i - 1);/*最后用同樣的方式對分出來的左邊的小組進(jìn)行同上的做法*/
? ?algorithm(array, i + 1, right);/*用同樣的方式對分出來的右邊的小組進(jìn)行同上的做法*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*當(dāng)然最后可能會出現(xiàn)很多分左右,直到每一組的i = j 為止*/}