快速排序:时间复杂度O(nlog2n)
才开始忘记那个递归的判断条件了。。。
以前一直以为递归难懂,其实并不是。。。
- //快速排序算法
- #include <stdio.h>
- #define MAX 10
- int Partition(int arr[], int left, int right) //选一个数,这个数左边的为小于它的,右边为大于它的
- {
- int low, high, x;
- low = left;
- high = right;
- x = arr[left]; //x选取第一个数,将其与其他数进行比较
- while(low < high)
- {
- while(arr[high] >= x && (low < high)) //先从右边开始遍历数
- high--;
- if(low < high)
- {
- arr[low] = arr[high];
- low++;
- }
- while(arr[low] <= x && (low < high)) //开始从左边开始遍历
- low++;
- if(low < high)
- {
- arr[high] = arr[low];
- high--;
- }
- }
- arr[low] = x; //将中间数放在low = high 的位置
- return low; //返回中间数的位置
- }
- //进行递归排序
- void RecursionQuickSort(int arr[], int low, int high)
- {
- int mid;
- if(low < high)
- {
- mid = Partition(arr, low, high); //得到中间数
- RecursionQuickSort(arr, low, mid - 1);
- RecursionQuickSort(arr, mid + 1, high); //中间的那个数不变
- }
- }
- int main()
- {
- int i;
- int arr[MAX] = {50, 45, 23, 45, 56, 74, 78, 89, 45, 56};
- RecursionQuickSort(arr, 0, MAX - 1);
- for(i = 0; i < MAX; i++)
- printf("%d ", arr[i]);
- printf("\n");
- return 0;
- }