快速排序在我们程序的世界当中是非常常见的;在以后的应聘当中更是一道基本上必考的排序题;
那么快速排序有两种写法;其实这两种写法本质是一样的;只是第二种写法更为通俗易懂;
#include写法二:using namespace std; void quickSort(int* arr, int start, int end) { if (start < end) { int i = start, j = end; while (i < j) { while (arr[i] <= arr[j] && i < j) { j--; } if (i < j) { arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; i++; } while (arr[i] < arr[j] && i < j) { i++; } if (i < j) { arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; j--; } } quickSort(arr, i + 1, end); quickSort(arr, start, i - 1); } } int main() { int arr[] = { 2, 9, 4, 3, 8, 6, 2, 1, 5, 4, 7, 3, 8, 4, 9 , 3, 5, 2 }; quickSort(arr, 0, 17); for (int i = 0; i < 18; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
#include解析:using namespace std; void quickSort(int* arr, int start, int end) { if (start < end) { int i = start, j = end, store = arr[start]; while (i < j) { while (i < j && arr[j] >= store) { j--; } if (i < j) { arr[i] = arr[j]; } while (i < j && arr[i] < store) { i++; } if (i < j) { arr[j] = arr[i]; } } arr[i] = store; quickSort2(arr, i + 1, end); quickSort2(arr, start, i - 1); } } int main() { int arr[] = { 2, 9, 4, 3, 8, 6, 2, 1, 5, 4, 7, 3, 8, 4, 9 , 3, 5, 2 }; quickSort(arr, 0, 17); for (int i = 0; i < 18; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
我们知道快速排序就是每一次以其中某一个数为中心;将大于它的所有的数放在后面;将小于它的所有数都放在它的左边;当然等于它的数左右皆可;
那么方法一是将这个指定的中心数(一般以第一个或最后一个为主)每一次的比较不合适之后都要进行换位;而且换的人头晕眼花的;如不细细琢磨和想象真的是会奔溃的;第二种方法则是显式的定义出来;这样这样就有个好处;不用每次比较不合适之后就去来回的交换位置(我们知道交换位置也是很浪费系统资源的);不过这里的使用的是异或交换法;效率最高;但主要是方法一不通俗,晦涩难懂;
注意方法二在完成一次大的比较之后(也就是一次递归执行之前)要将那个“空位”填补上;那么就是什么呢?就是之前我们定义的那个中心数;因为所有小于或等于的数都在它的左边,所有大于它的数都在它的右边;而中间(不一定是绝对的中间)的那个所谓的“空位”(其实是有数,只是对换到最后留下来的)就是那个中心数的位置;
不知道大家理解了没有;希望能对大家有帮助;最后附上运行结果图一张;
运行结果:


