数据结构与算法学习五:快速排序
一. 排序方法
?
二. 动画演示
???? http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/kuaisupaixu.htm
?
三.Java代码?
/** * 快速排序 * @param data * @param low data最小下标 * @param high data最大下标 * @return */public static int[] quickSort(int[] data, int low, int high) {// 对data[low..high]快速排序int pivotpos; // 划分后的基准记录的位置if (low < high) {// 仅当区间长度大于1时才须排序pivotpos = partition(data, low, high); // 对data[low..high]做划分quickSort(data, low, pivotpos - 1); // 对左区间递归排序quickSort(data, pivotpos + 1, high);// 对右区间递归排序}return data;}/** * 划分算法,划分后 * 左边子区间中所有记录的关键字均小于等于基准记录pivot * 右边的子区间中所有记录的关键字均大于等于pivot * 基准记录pivot则位于正确的位置上 * @param data * @param i * @param j * @return */public static int partition(int[] data, int i, int j) {// 并返回基准记录的位置int pivot = data[i]; // 用区间的第1个记录作为基准 ,while (i < j) { // 从区间两端交替向中间扫描,直至i=j为止while (i < j && data[j] >= pivot) {// pivot相当于在位置i上j--; // 从右向左扫描,查找第1个关键字小于pivot的记录data[j]}if (i < j) // 表示找到的data[j]的关键字<pivotdata[i++] = data[j]; // 相当于交换data[i]和data[j],交换后i指针加1while (i < j && data[i] <= pivot) {// pivot相当于在位置j上i++; // 从左向右扫描,查找第1个关键字大于pivot的记录data[i]}if (i < j) // 表示找到了R[i],使data[i]>pivotdata[j--] = data[i]; // 相当于交换data[i]和data[j],交换后j指针减1} // endwhiledata[i] = pivot; // 基准记录已被最后定位return i;}?
?
四.时间复杂度和稳定性