赞
踩
选择数组中第一个元素为基数,以基数为衡量标准,将小于等于基数的数放在基数的左边,大于基数的数放在基数的右边,这样就将所有的数一分为二。然后再将基数两侧的数分别进行排序,此时需要用到递归。不断将数组一分为二,再左右两侧分别进行排序,最终顺序就排好了。
- #include<stdio.h>
- void quicksort( int left, int right, int arr[]) {
- int i = 0, j = 0, tmp = 0;
- i = left;
- j = right;
- //以最左边的数为基数
- if (i >= j) {
- return ;
- }
- while (i < j) {
- //必须要先从右边找比基数小的数
- // 3 1 2 5 4
- //如果先从左向右找,找到了比基数大的数arr[i],但是j>i,从i到结尾没有比基数小的数,未能进行i,j交换
- //循环完以后i代表的是比基数大的数,不能和arr[left]进行交换
- //先从右向左找,肯定能找到一个比基数小的数,即使i,j不进行交换,i==j,基数也可以和arr[i]进行交换
-
- //从右向左找,找到一个比基数小的数
- while (i<j && arr[j]>=arr[left]) {
- j--;
- }
- //从左向右找,找到一个比基数大的数
- while (i < j && arr[i] <= arr[left]) {
- i++;
- }
- //交换这两个数
- if (i < j) {
- tmp = arr[i];
- arr[i] = arr[j];
- arr[j] = tmp;
- }
- }
- //循环完以后,下标i所指向的数是比基数小的数,交换基数和arr[i]
- tmp = arr[left];
- arr[left] = arr[i];
- arr[i] = tmp;
- //此时数组可以分成两部分,以基数为分界线,左边比基数小,右边比基数大
- //将基数左边的数进行排序
- quicksort( left, i - 1,arr);
- //将基数右边的数进行排序
- quicksort( i + 1, right,arr);
- }
- int main() {
- int n = 0, i = 0;
- scanf("%d", &n);
- int arr[10];
- for (i = 0; i < n; i++) {
- scanf("%d", &arr[i]);
- }
- quicksort( 0, n - 1,arr);
- for (i = 0; i < n; i++) {
- printf("%d ", arr[i]);
- }
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。