|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define MAX 5
using namespace std;
void QuickSort (int v[], int start, int end)
{
if (start >= end)
return ;
int pivot = v[start];
int i = start + 1, j = end;
while(i < j)
{
while(v[j] > pivot && i < j)
j--;
while(v[i] < pivot && j > i)
i++;
swap(v[i], v[j]);
cout << "j = " << j<< endl;
}
for (int k = 0; k < MAX; k++)
cout << v[k] << ' ';
cout << endl;
if (v[start] >= v[j]) 第26行
swap(v[j], v[start]);
if (j)
QuickSort(v, 0, j - 1);
if (j < end)
QuickSort(v, j + 1, end);
}
int main()
{
int v[MAX] = {0};
for (int i = 0; i < MAX; i++)
cin >> v[i];
QuickSort(v, 0, MAX - 1);
for (int i = 0; i < MAX; i++)
cout << v[i] << ' ';
return 0;
}
问题集合:
1.错误?
情况是:我把MAX 改成3, 输入1 12 2,结果没有改动,还是输出1 12 2
2.当i = j时,如何确定这个数要不要和pivot交换,我26行那个位置,原来是没有那句话的,可是输入1 12 2,就会输出12 1 2
3.会不会出现中间有两个数都等于pivot,结果第一个while陷入死循环的情况?如果出现,又该如何解决?
谢谢大家的帮助,新手(大一学生)
楼主,你的代码,在下实在看不懂!!!
所以在下重新写了一个,
- #include <iostream>
- #define n 5
- using namespace std;
- //快排函数
- void quicksort(int * a , int left, int right);
- int main(void)
- {
- int a[n] = 0;
- for(int i=0; i<n; i++)
- {//输入数据
- cin >> a[i];
- }
- int left = 0;
- int right = n-1;
- //递归排序
- quicksort(a, left, right);
- for(int j=0; j<n; j++)
- {//输出结果
- cout << a[j] <<" ";
- }
- cout << endl;
- return 0;
- }
- void quicksort(int * a , int left, int right)
- {
- int temp = a[left]; //基准数据//将左边第一个作为基准数据
- int i = left;
- int j = right;
- if(left > right)
- return ;
- while(i != j)
- {//一直进行直到ij相遇
- while(a[j] >= temp && i < j)
- {//从最右边开始比较//必须的//如果大于基准数据,那么j--,否则,开始左边的比较
- j--;
- }
- while(a[i] <= temp && i < j)
- {//如果小于基准数据,i++, 否则交换a[i], a[j]
- i++;
- }
- if(i < j)
- {//交换
- int t = 0;
- t = a[i];
- a[i] = a[j];
- a[j] = t;
- }
-
- }
- //当i和j相遇时候,将基准数据和相遇点的数据交换
- a[left] = a[i];
- a[i] = temp;
- //递归排列相遇点左边和右边的数据
- quicksort(a, left, i-1);
- quicksort(a, i+1, right);
- }
复制代码
|
|