快速排序思想如下:
分而治之。
1、取待排序列的任意数作为基准点和队列作比较,把序列一分为二,左边是比基准数小的,右边比基准数大的。
2、再把已分的二个序列按照上边的步骤重复,直至序列不能再分。
从这里可以看出,一分为二的操作都是一样步骤,所以这里用到递归。具体请看视频:
C#代码如下:
1 using System; 2 3 namespace Demo 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 int[] arr = {7,12,5,8,4,2,10,15 }; 10 11 QuickSort(arr, 0, arr.Length-1); 12 foreach (var item in arr) 13 { 14 Console.WriteLine(item); 15 } 16 Console.Read(); 17 } 18 19 static void QuickSort(int[] arr,int start,int end) 20 { 21 int temp = arr[start], i, j; 22 i = start; 23 j = end; 24 if (i < j) 25 { 26 while (i < j) 27 { 28 while (i < j && temp < arr[j]) 29 { 30 j--; 31 } 32 if (i < j) 33 { 34 arr[i] = arr[j]; 35 i++; 36 } 37 38 while (i < j && temp > arr[i]) 39 { 40 i++; 41 } 42 if (i < j) 43 { 44 arr[j] = arr[i]; 45 j--; 46 } 47 } 48 arr[i] = temp; 49 QuickSort(arr, start, i - 1); 50 QuickSort(arr, i + 1, end); 51 } 52 } 53 } 54 }
C++代码如下:
1 #include <iostream> 2 void QuickSort(int arr[], int start, int end); 3 void swap(int& a, int& b); 4 5 int main() 6 { 7 int a[] = { 7,12,5,8,4,2,10,15 }; 8 int size = sizeof(a) / sizeof(int); 9 QuickSort(a,0,size-1); 10 for (int i = 0; i < size; i++) 11 { 12 std::cout << a[i] << ", "; 13 } 14 std::cout << std::endl; 15 } 16 17 void swap(int& a, int& b) 18 { 19 int tmp = a; 20 a = b; 21 b = tmp; 22 } 23 24 void QuickSort(int arr[],int start,int end) 25 { 26 if (start > end) 27 return; 28 int k = arr[start]; 29 int i = start, j = end; 30 while (i < j) { 31 while (j > i && arr[j] > k) 32 --j; 33 swap(arr[i],arr[j]); 34 while (i < j && arr[i] < k) 35 ++i; 36 swap(arr[i], arr[j]); 37 } 38 QuickSort(arr,start,i-1); 39 QuickSort(arr, i + 1, end); 40 }
Python代码如下:
1 def quicksort (array): 2 if len(array) < 2: 3 return array 4 else: 5 pivot = array[0] 6 less = [i for i in array[1: ] if i <= pivot] 7 greater = [i for i in array[1: ] if i > pivot] 8 return quicksort(less)+[pivot]+quicksort(greater) 9 10 print (quicksort([7,12,5,8,4,2,10,15]))