說到快速排序演算法,可能我們會了解到其最壞的執行時間為o(n*n),但是對於其平均效能為o(nlgn),正是這一點使得其被廣泛的使用,另乙個重要的特點就是,其能夠進行原地排序,能夠盡可能的減少空間的占用,盡可能的減小演算法使用的空間。說了這麼多理由,那麼到底是怎麼一回事,或者到底是怎麼樣的呢?
其核心部分就是選取乙個元素,將大於它的放置到右邊,將小於它的放置到左邊,然後可以將其中間的位置與選取的元素進行交換,得到排序後的結果,是的,快速排序,歸併排序,堆排序等都是基於交換的演算法,故其演算法一般的執行時間為o(nlgn),所以在這裡其是最核心的東西還是交換,只不過交換的條件或者是形式改變了。
這麼空泛的說可能比較蒙,結合**來討論一下:
public class quicksort
} private static int partition(int array, int left, int right)
}//將最後元素array[right]和迴圈結束時i+1 的位置進行交換,因為此時
//陣列中的array[right]所在的正確位置即為i + 1的位置,故進行交換
temp = array[i + 1];
array[i + 1] = array[right];
array[right] = temp;
//返回的是位置 i+1,即被比較元素應該在的地方
return i + 1;
}}
其實對於執行時間的影響來說,parition方法影響最大,因為其劃分的結果直接影響了排序演算法的效能,方法劃分的時候有時候是好的,有時候是壞的,這個不好說,上面寫的並不是原版的,原版的hoare所提出的快速排序演算法為:
public class quicksort
} 提出的快速排序的版本
public static int parition1(int array, int left, int right)
}//此時i 和j應該時相當的,即i = j
array[left] = array[i];
array[i] = basic_value;
return i;
}}
然而分析快速排序演算法的**可以發現有些時候對於某些遞迴呼叫是浪費的,而對於這種情況,了解到一種優化方式叫做尾遞迴,這個最終還是要看編譯器是否支援的,對於使用尾遞迴,我們可以認為第二次遞迴呼叫是沒意義的,可以使用迴圈結構來進行控制,對此我們可以修改一下**:
public class quicksort
} private static int partition(int array, int left, int right)
}//將最後元素array[right]和迴圈結束時i+1 的位置進行交換,因為此時
//陣列中的array[right]所在的正確位置即為i + 1的位置,故進行交換
temp = array[i + 1];
array[i + 1] = array[right];
array[right] = temp;
//返回的是位置 i+1,即被比較元素應該在的地方
return i + 1;
}}
最後我們了解一下尾遞迴的棧深度,了解一下尾遞迴的另一種寫法:
public class tailrecurivequicksort else
}decrement_stack_depth();
}public static int partition(int array, int left, int right)
}temp = array[i + 1];
array[i + 1] = array[right];
array[right] = temp;
return i + 1;
}private static void increment_stack_depth()
}private static void decrement_stack_depth()
private static void reset_depth_counter()
}
排序演算法整理 快速排序
public static void quick sort int arr int l,int r quick sort arr,l,j quick sort arr,j 1,r 快排的思路 首先一組資料 找乙個基準數 這裡選用陣列的第一位做基準資料 之後i從前往後掃,找到乙個大於 或等於 基準資料...
演算法 排序演算法整理 快速排序
快速排序是在氣泡排序的基礎上改進而來的,氣泡排序每次只能交換相鄰的兩個元素,而快速排序是跳躍式的交換,交換的距離很大,因此總的比較和交換次數少了很多,速度也快了不少。快速排序的演算法思想稍微有點複雜,但是還是比較容易理解的。快速排序的思想就是挖坑填坑 分治法 比如下面這個陣列,我們首先選擇乙個基準數...
排序演算法整理小結(歸併排序)
排序演算法,說真的,就是乙個排列順序的演算法,有些廢話了哈,不過話說回來,順序對於我們實現某些功能有很大的幫助,然而如何能夠快速的將乙個無序數列排列好呢?這次整理了幾種排序方法,總結講述了一下實現的原理以及過程,話比較直接,相信各位看官看 也許比我說要好得多,直接開始吧。單單看這個名字,歸併,歸併什...