voidSort_Quick( int* a, int low, int high ) { int pos; // 中间点 L=H 时的位置 if( low < high ) // 只有 low<high 时才继续进行 { pos = FindPos(a, low, high); // 获取中间点 L=H 的位置 Sort_Quick(a, low, pos - 1); // 中间点左半部递归 Sort_Quick(a, pos + 1, high); // 中间点右半部递归 } }
intFindPos( int* a, int low, int high ) { int val = a[low]; while( low < high ) { // 首先从右边 high 开始向左进行查找 while( low < high && a[high] > val ) // high 指向的元素大于val,high左移 { high--; // a[high]>val,不需要赋值,则high左移 } a[low] = a[high]; // 即a[high]<val的情况,此时将a[high]赋给a[low] // 再从左边 low 开始向右进行查找 while( low < high && a[low] < val ) // low指向的元素小于val,low右移 { low++; // a[low]<val,不需要赋值,则low右移 } a[high] = a[low]; // 即a[low]>val的情况,此时将a[low]赋值给a[high] } //终止循环之后 L和H 一定是相等的 a[low] = val; // L=H,此时将val的值赋给 a[low]和a[high] 是一样的 return high; // 返回下标,等价于 return low; }
菜鸟教程
C++
//严蔚敏《数据结构》标准分割函数 intParitition1(int A[], int low, int high){ int pivot = A[low]; while (low < high) { while (low < high && A[high] >= pivot) { --high; } A[low] = A[high]; while (low < high && A[low] <= pivot) { ++low; } A[high] = A[low]; } A[low] = pivot; return low; }
voidQuickSort(int A[], int low, int high)//快排母函数 { if (low < high) { int pivot = Paritition1(A, low, high); QuickSort(A, low, pivot - 1); QuickSort(A, pivot + 1, high); } }
C
typedefstruct _Range { int start, end; } Range;
Range new_Range(int s, int e) { Range r; r.start = s; r.end = e; return r; }
voidswap(int *x, int *y) { int t = *x; *x = *y; *y = t; }
voidquick_sort(int arr[], constint len) { if (len <= 0) return; // 避免len等于负值时引发段錯誤(Segment Fault) // r[]模板列表,p为數量,r[p++]为push,r[--p]为pop且取得元素 Range r[len]; int p = 0; r[p++] = new_Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start >= range.end) continue; int mid = arr[(range.start + range.end) / 2]; // 选取中间点为基准点 int left = range.start, right = range.end; do { while (arr[left] < mid) ++left; // 检测基准点左侧是否符合要求 while (arr[right] > mid) --right; //检测基准点右侧是否符合要求 if (left <= right) { swap(&arr[left], &arr[right]); left++; right--; // 移动指针以继续 } } while (left <= right); if (range.start < right) r[p++] = new_Range(range.start, right); if (range.end > left) r[p++] = new_Range(left, range.end); } }
C & 递归法
voidswap(int *x, int *y) { int t = *x; *x = *y; *y = t; }
voidquick_sort_recursive(int arr[], int start, int end) { if (start >= end) return; int mid = arr[end]; int left = start, right = end - 1; while (left < right) { while (arr[left] < mid && left < right) left++; while (arr[right] >= mid && left < right) right--; swap(&arr[left], &arr[right]); } if (arr[left] >= arr[end]) swap(&arr[left], &arr[end]); else left++; if (left) quick_sort_recursive(arr, start, left - 1); quick_sort_recursive(arr, left + 1, end); }
voidquick_sort(int arr[], int len) { quick_sort_recursive(arr, 0, len - 1); }
C++ & 函数法
sort(a,a + n);// 排序a[0]-a[n-1]的所有数.
C++ & 迭代法
// 参考:http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/ structRange { int start, end; Range(int s = 0, int e = 0) { start = s, end = e; } }; template <typename T> // 整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"(<)、"大於"(>)、"不小於"(>=)的運算子功能 voidquick_sort(T arr[], constint len){ if (len <= 0) return; // 避免len等於負值時宣告堆疊陣列當機 // r[]模擬堆疊,p為數量,r[p++]為push,r[--p]為pop且取得元素 Range r[len]; int p = 0; r[p++] = Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start >= range.end) continue; T mid = arr[range.end]; int left = range.start, right = range.end - 1; while (left < right) { while (arr[left] < mid && left < right) left++; while (arr[right] >= mid && left < right) right--; std::swap(arr[left], arr[right]); } if (arr[left] >= arr[range.end]) std::swap(arr[left], arr[range.end]); else left++; r[p++] = Range(range.start, left - 1); r[p++] = Range(left + 1, range.end); } }
C++ & 递归法
template <typename T> voidquick_sort_recursive(T arr[], int start, int end){ if (start >= end) return; T mid = arr[end]; int left = start, right = end - 1; while (left < right) { //在整个范围内搜寻比枢纽元值小或大的元素,然后将左侧元素与右侧元素交换 while (arr[left] < mid && left < right) //试图在左侧找到一个比枢纽元更大的元素 left++; while (arr[right] >= mid && left < right) //试图在右侧找到一个比枢纽元更小的元素 right--; std::swap(arr[left], arr[right]); //交换元素 } if (arr[left] >= arr[end]) std::swap(arr[left], arr[end]); else left++; quick_sort_recursive(arr, start, left - 1); quick_sort_recursive(arr, left + 1, end); } template <typename T> //整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"(<)、"大於"(>)、"不小於"(>=)的運算子功能 voidquick_sort(T arr[], int len){ quick_sort_recursive(arr, 0, len - 1); }