快速排序的思路是这样的 一般的思路
以第一个元素为关键字key,把数分成两部分,一部分小于关键字的,一部分大于关键字的,主要的在于关键字的变化
例如:
输入:8
49 38 65 97 76 13 27 49
先是以49为关键字,l=0....n-1;
第一次交换是 l=2,r=7,arr[l]=65 arr[r]=49 49 38 49 97 76 13 27 65
2 l=3,r=6,arr[l]=97 arr[r]=27 49 38 49 27 76 13 97 65
3 l=4,r=5,arr[l]=76 arr[r]=13 49 38 49 27 13 76 97 65
4 l=5,r=4,arr[l]=76 arr[r]=13 跳出while(l<r)
5 关键字key=13, 13 38 49 27 49 96 97 65
#include <iostream>
using namespace std;
void swap(int &a, int &b)//一开始这里没有用取地址符,后来调试出来了
{
int temp;
temp=a;
a=b;
b=temp;
}
void QuickSort(int l,int r,int *arr)//0,len
{
int key=arr[l];
if (l>=r)
return;
int ll=l,rr=r;
while (l<r)
{
while (arr[++l]<key&&l<rr);//找到一个 大于等于key的数
while (arr[--r]>key&&r>ll);//找到一个 小于等于key的数
if (l<r)
swap(arr[l],arr[r]);
}
arr[ll]=arr[r];
arr[r]=key;
QuickSort(ll,l-1,arr);
QuickSort(r+1,rr,arr);
}
int main()
{
int *arr=new int[8];
int n;
while (cin>>n)
{
for (int i=0; i<n; i++)
cin>>arr[i];
QuickSort(0,n,arr);
for (int j=0; j<n; j++)
cout<<arr[j]<<" ";
cout<<endl;
}
delete [] arr;
return 0;
}