vlambda博客
学习文章列表

快速排序及其四种优化版本

基础代码

#include <iostream>#include<stdlib.h>int pivitition(int arr[], int low, int high);void swap(int* a, int* b){ int pivotkey = *a; *a = *b; *b = pivotkey;}void qsort(int arr[], int low,int high){ int pivot;
if (low<high) { pivot = pivitition(arr, low, high); qsort(arr, low, pivot - 1); qsort(arr, pivot + 1, high); }}int pivitition(int arr[], int low, int high){ int pivotkey; pivotkey = arr[low]; while (low < high) { while (low<high && arr[high]>=pivotkey) { high--; } swap(&arr[high], &arr[low]); while (low < high && arr[low] <=pivotkey) { low++; } swap(&arr[low], &arr[high]); }
return low;}
int main(){ int arr[9] = { 6,1,0,12,7,5,4,3,23 }; qsort(arr, 0, 8); for (int i = 0; i < 9; i++) { printf(" %d", arr[i]); }}


优化:三数取中

#include <iostream>#include<stdlib.h>int pivitition(int arr[], int low, int high);void swap(int* a, int* b){ int pivotkey = *a; *a = *b; *b = pivotkey;}void qsort(int arr[], int low, int high){ int pivot;
if (low < high) { pivot = pivitition(arr, low, high); qsort(arr, low, pivot - 1); qsort(arr, pivot + 1, high); }}int pivitition(int arr[], int low, int high){ int pivotkey; int m = low + (high - low) / 2; if (arr[low] > arr[high]) swap(&arr[low], &arr[m]); if (arr[m] > arr[high]) swap(&arr[m], &arr[high]); if (arr[m] > arr[low]) swap(&arr[m], &arr[low]); pivotkey = arr[low];

while (low < high) { while (low < high && arr[high] >= pivotkey) { high--; } swap(&arr[high], &arr[low]); while (low < high && arr[low] <= pivotkey) { low++; } swap(&arr[low], &arr[high]); }
return low;}
int main(){ int arr[9] = { 6,1,0,12,7,5,4,3,23 }; qsort(arr, 0, 8); for (int i = 0; i < 9; i++) { printf(" %d", arr[i]); }}

优化2:采用替换而非交换

#include <iostream>#include<stdlib.h>int pivitition(int arr[], int low, int high);void swap(int* a, int* b){ int pivotkey = *a; *a = *b; *b = pivotkey;}void qsort(int arr[], int low, int high){ int pivot;
if (low < high) { pivot = pivitition(arr, low, high); qsort(arr, low, pivot - 1); qsort(arr, pivot + 1, high); }}int pivitition(int arr[], int low, int high){ int pivotkey; pivotkey = arr[low]; int temp = pivotkey;/*++++++++++++++++不会*/ while (low < high) { while (low < high && arr[high] >= pivotkey) { high--; } arr[low] = arr[high];/*++++++++++++++++不会*/ while (low < high && arr[low] <= pivotkey) { low++; } arr[high] = arr[low];/*++++++++++++++++不会*/ } arr[low] = temp; return low;}
int main(){ int arr[14] = { 6,1,56,23,2,8,32,0,12,7,5,4,3,23 }; qsort(arr, 0, 13); for (int i = 0; i < 14; i++) { printf(" %d", arr[i]); }}

优化3:若数组长度太少则直接使用直接插入排序

#include <iostream>#include <stdlib.h>#define MAX_LENGTH 11void swap(int* a, int* b){ int pivotkey = *a; *a = *b; *b = pivotkey;}void insertion(int arr[], int length){ int i, j; for (i = 1; i < length; i++) { if (arr[i] < arr[i - 1]) { int temp = arr[i]; for (j = i - 1; arr[j]>temp; j --) { arr[j + 1] = arr[j]; } arr[j+1] = temp; } }}int pivitition(int arr[], int low, int high){ int pivotkey; pivotkey = arr[low]; while (low < high) { while (low < high && arr[high] >= pivotkey) { high--; } swap(&arr[high], &arr[low]); while (low < high && arr[low] <= pivotkey) { low++; } swap(&arr[low], &arr[high]); }
return low;}void qsort(int arr[], int low, int high){ int pivot; if (( high - low )>MAX_LENGTH) { pivot = pivitition(arr, low, high); qsort(arr, low, pivot - 1); qsort(arr, pivot + 1, high); } else { insertion(arr, 9); }
}int main(){ int arr[9] = { 6,1,0,12,7,5,4,3,23 }; qsort(arr, 0, 8); for (int i = 0; i < 9; i++) { printf(" %d", arr[i]); }}

优化4:采用迭代而非递归

#include <iostream>#include <stdlib.h>#define MAX_LENGTH 11void swap(int* a, int* b){ int pivotkey = *a; *a = *b; *b = pivotkey;}void insertion(int arr[], int length){ int i, j; for (i = 1; i < length; i++) { if (arr[i] < arr[i - 1]) { int temp = arr[i]; for (j = i - 1; arr[j] > temp; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = temp; } }}int pivitition(int arr[], int low, int high){ int pivotkey; pivotkey = arr[low]; while (low < high) { while (low < high && arr[high] >= pivotkey) { high--; } swap(&arr[high], &arr[low]); while (low < high && arr[low] <= pivotkey) { low++; } swap(&arr[low], &arr[high]); }
return low;}void qsort(int arr[], int low, int high){ int pivot; if ((high - low) > MAX_LENGTH) { while (low < high) { pivot = pivitition(arr, low, high); qsort(arr, low, pivot - 1); low = pivot + 1; }
} else { insertion(arr, 9); }
}int main(){ int arr[9] = { 6,1,0,12,7,5,4,3,23 }; qsort(arr, 0, 8); for (int i = 0; i < 9; i++) { printf(" %d", arr[i]); }}