#include <stdio.h> #include <stdlib.h> void swap(int *pi, int *pj)//交换数据 { int temp = *pi; *pi = *pj; *pj = temp; } void show(int *p,int n)//显示数组状态 { printf(" 此时状态"); for (int i = 0; i < n; i++) { printf("%4d", p[i]); } } void quick(int *arr, int iLeft, int iRight) { int i = iLeft;//从左边开始循环 int j = iRight + 1;//从右边开始循环 if (i < j)//如果左边小于右边 { do { do { i++; } while (arr[i] <= arr[iLeft] && i < iRight); //从左向右找第一个大于arr[iLeft]的数 do { j--; } while (arr[j] >= arr[iLeft] && j>iLeft); //从右向左找第一个小于arr[iLeft]的数 //如果大数的位置小于小数的位置则进行交换 if (i < j) { swap(&arr[i], &arr[j]); } //这一步的目的是把大的数都放在右边 } while (i < j);//一直循环到i>=j 说明已经已经折中分好了 此时j保存的是小于arr[iLeft]的数所以要和arr[iLeft]交换 swap(&arr[iLeft], &arr[j]); //j是分界点,快速排序 左边的 以及右边的 quick(arr, iLeft, j - 1); quick(arr, j + 1, iRight); } } void main() { int num[10] = { 10, 9, 20, 19, 1, 8, 9, 22, 0, 91 }; quick(num, 0, 9); show(num, 10); system("pause"); }