快速排序
参考:
http://www.cnblogs.com/skywang12345/p/3596746.html
下面上代码:
#include<iostream> using namespace std; void quicksort(int *arr, int left, int right) { if(left < right) { int i = left; int j = right; int temp = arr[i]; while(i < j) { while(i < j && arr[j] > temp) { j--; } if(i < j) { arr[i] = arr[j];// arr[i++] = arr[j]; i++; } while(i < j && arr[i] < temp) { i++; } if(i < j) { arr[j] = arr[i]; // arr[j--] = arr[i]; j--; } } arr[i] = temp; quicksort(arr, left, i-1); quicksort(arr, i+1, right); } } int main() { int arr[] = {30, 20, 40, 20, 10, 40, 60, 50,90,70, 70}; int count = sizeof(arr)/sizeof(int); cout << "Before:" << endl; for(int i = 0; i < count; i++) { cout << arr[i] << " "; } cout << endl; quicksort(arr, 0, count - 1); cout << "After:" << endl; for(int i = 0; i < count; i++) { cout << arr[i] << " "; } cout << endl; }
分析:
以数组int arr[] = {4, 5, 2 ,6, 1, 3};进行分析:
初始化 i=0,j=5, temp = arr[0];
红色加粗的表示在下一次将会被覆盖的位置。
循环次数 |
退出while条件 |
当前数组 |
对应的操作 |
|
1 |
i=0,j=5 <- |
3 < temp |
3 5 2 6 1 3 |
arr[0]=arr[5], i++ (arr[i++]=arr[j]) |
2 |
i=1,j =5 -> |
5 > temp |
3 5 2 6 1 5 |
arr[5]=arr[1],j-- (arr[j--]=arr) |
3 |
i=1,j=4 <- |
1 < temp |
3 1 2 6 1 5 |
arr[1]=arr[4], i++ (arr[i++]=arr[j]) |
4 |
i=2,j=4 -> |
3 1 2 6 1 5 |
i++ (因为2小于temp,直接i++) |
|
5 |
i=3,j=4, -> |
6 > temp |
3 1 2 6 6 5 |
arr[4]=arr[3]; j-- (arr[j--]=arr) |
6 |
i=3,j=3 |
3 1 2 4 6 5 |
arr[3] = temp |
第一次循环之后数组变成了这样 3 1 2 4 6 5,I,j的值都是3。
arr[3]左边的全部小于arr[3],arr[3]右边的全部大于arr[3]
然后对两边分别进行排序;
quicksort(arr, 0, 2);
quicksort(arr, 4, 5);