赞
踩
给定一个无序数组 a r r arr arr,对其排序。
快速排序的时间复杂度在于数组划分与递归次数两部分.
快速排序的空间复杂度为 O ( 1 ) O(1) O(1)
c++
#include <exception> #include <vector> #include <ctime> using std::vector; using std::exception; using std::rand; using std::srand; class QuickSort { public : // 排序过程中指向被排序数组,减少递归传参 vector<int>* parr = nullptr; void quick_sort(vector<int>& arr) { if (arr.size() == 0) // 数组判空 throw exception("arr cannot be empty!"); this->parr = &arr; this->_quick_sort(0, this->parr->size()); this->parr = nullptr; // 排序完成后置空 } private : void _quick_sort(int left, int right) { if (left + 1 == right) return; // 随机选取主元素,与尾元素交换 srand(time(nullptr)); int pos = rand() % (right - left) + left; int main_element = (*this->parr)[pos]; (*this->parr)[pos] = (*this->parr)[right - 1]; (*this->parr)[right - 1] = main_element; // 遍历除主元素外的所有元素,数组划分 int i = left - 1, j = left, temp = 0; for ( ; j < right - 1; j++) { if (this->parr->at(j) < main_element) { temp =(*this->parr)[i+1]; (*this->parr)[i + 1] = (*this->parr)[j]; (*this->parr)[j] = temp; i++; } } // 将主元素交换到中间,使其左侧元素小于它,右侧元素大于它 temp = (*this->parr)[i + 1]; (*this->parr)[i + 1] = main_element; (*this->parr)[right - 1] = temp; i++; // 使i指向主元素 // 当主元素左侧存在元素时进行子数组排序 if (left < i) this->_quick_sort(left, i); // 当主元素右侧存在元素时进行子数组排序 if (i + 1 < right) this->_quick_sort(i + 1, right); } };
java
import java.lang.RuntimeException; import java.util.Random; public class QuickSort{ public void quick_sort(int[] arr){ if (arr.length == 0) throw new RuntimeException("arr cannot be empty!"); this.arr = arr; this._quick_sort(0, arr.length); this.arr = null; // 排序完成后置空临时引用 } private int[] arr = null; // 排序中指向被排序数组,减少递归传参 private void _quick_sort(int left, int right){ if (left + 1 == right) return; // 随机选取主元素,与尾元素交换 Random rdm = new Random(); int pos = rdm.nextInt(right-left) + left; int main_element = this.arr[pos]; this.arr[pos] = this.arr[right - 1]; this.arr[right - 1] = main_element; // 数组划分,遍历除主元素外的所有元素,使小于主元素的位于左侧,大于主元素的位于右侧 int i = left - 1, j = left, temp = 0; for (; j < right - 1; j++){ if (this.arr[j] < main_element){ temp = this.arr[i+1]; this.arr[i+1] = this.arr[j]; this.arr[j] = temp; i++; } } // 将主元素交换到中间,使左侧元素小于它,右侧元素大于它 temp = main_element; this.arr[right-1] = this.arr[i+1]; this.arr[i+1] = temp; i++; // 使i指向主元素 // 主元素左侧存在元素则进行左侧子数组排序 if (left < i) this._quick_sort(left, i); // 主元素右侧存在元素则进行右侧子数组排序 if (i + 1 < right) this._quick_sort(i + 1, right); } }
python
class QuickSort: def quick_sort(self, arr: list) -> None: if len(arr) == 0 : # 数组判空 raise Exception("arrr cannot be empty!") else : self.__arr = arr # 用类成员指向待排序数组,替代传参 self.__quick_sort(0, len(self.__arr)) self.__arr = None # 重置成员数组 def __quick_sort(self, left: int, right: int) -> None: if left + 1 == right: # 仅有一个元素时终止递归 return None # 1. 定位主元素,放在数组最后 pos = randint(left, right - 1) main_element = self.__arr[pos] self.__arr[pos] = self.__arr[right - 1] self.__arr[right - 1] = main_element # 2. 数组划分,使小于主元素的元素位于主元素左侧,大于主元素的元素位于主元素右侧 i = left - 1 # <=i索引为小于等于主元素的元素,>i索引为大于主元素的元素 j = left # j为遍历索引 while j < right - 1: if self.__arr[j] <= main_element: temp = self.__arr[i+1] self.__arr[i+1] = self.__arr[j] self.__arr[j] = temp i += 1 j += 1 temp = self.__arr[i+1] self.__arr[i+1] = self.__arr[right-1] self.__arr[right-1] = temp i += 1 # 使i指向主元素 # 3. 左侧子数组快速排序 if i > left : # 主元素左侧还存在元素时才排序 self.__quick_sort(left, i) # 4. 右侧子数组快速排序 if i + 1 < right: # 主元素右侧还存在元素时才排序 self.__quick_sort(i+1, right)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。