标记一下写快排的细节和注意事项
1. 首先qsort和归位函数都需要int* ,left ,right 三个参数
2.求数组的个数,记得用sizeof nums/sizeof(int),否则会溢出
3.归位函数:如果选nums[left] 作为middle的值,则记得要先用右指针往左移。因为如果用左指针先往右,则有可能交换时,nums[ j ]的值是比middle要大的
4.归位函数,右指针往左移动时,nums[i] nums[j] 的值交换后,i++ 。因为此时,交换完后i的位置是已经排序过的。
5. qsort函数中,找到mid后进行递归时,
qsort(nums, left, mid-1); qsort(nums, mid+1,right)
以下为AC代码
#include <iostream>
#include<cmath>
#include<cstring>
using namespace std;
int nums[20] = { 3, 6, 9, 2, 4, 5, 1, 57, 6, 98, 0, 21, 34, 17, 77,68,24, 18,9,89 };
void q_sort(int* arr,int left,int right);
int guiwei(int* arr, int left, int right);
int main()
{
int n = sizeof nums / sizeof(int);
q_sort(nums, 0, n - 1);
cout << "排位后的数组为" << endl;
for (int i = 0; i < n; i++)
{
cout << nums[i];
cout << " ";
}
return 0;
}
int guiwei(int* arr, int left, int right)
{
int middle = arr[left];
int i = left, j = right;
while (i < j)
{
while (i < j && arr[j] >= middle)
{
j--;
}
if (i < j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
}
while (i < j && arr[i] <= middle)
{
i++;
}
if (i < j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j--;
}
}
return i;
}
void q_sort(int* arr, int left, int right)
{
int mid;
if (left < right)
{
mid = guiwei(arr, left, right);
q_sort(arr, left, mid - 1);
q_sort(arr, mid + 1, right);
}
}