数据结构作业,关于快速排序

JackGG 2010-10-24 08:02:33
给定元素序列(12,7,13,6,24,22,8,9。20,18),若用快速排序法对其进行排序,请回答:
(1)如果总是选择第一个元素作为pivot元素,请列出所有长度大于等于3的子序列中被选为pivot的元素。

对快速排序还是没搞懂。
...全文
291 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
如影随从 2010-10-24
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
#include<time.h>

void QuickSort( int * const pData,const int left,const int right);
int main()
{
int data[100];
int j;
int num;
srand(time(NULL));
cout<<"请输入数组的个数:";
cin>>num;
cout<<"\n随机数列为:"<<endl;
for(j=0;j<num;j++)
{
data[j]=rand()%100;
cout<<data[j]<<"\t";
}
cout<<endl;
const int count(num-1);
QuickSort(data,0,count);
cout<<"\n排序后的结果为:\n";
for(int i(0);i!=num;++i)
{
cout<<data[i]<<"\t";
//cout<<data[i]<<" "<<flush;
}
cout<<endl;
return 0;
}


void QuickSort( int * const pData,const int left,const int right)
{
int i(left),j(right),middle(0),iTemp(0);
middle=pData[(left+right)/2];//求中间值
middle=pData[(rand()%(right-left+1))+left]; //生成大于等于left小于等于right的随机数
do
{
while((pData[i]<middle)&&(i<right)) //从左扫描大于中值的数
i++;
while((pData[j]>middle) && (j>left))//从右扫描小于中值的数
j--; //找到了一对值,交换
if(i<=j)
{
//swap(pData[j],pData[i]);
iTemp=pData[j];
pData[j]=pData[i];
pData[i]=iTemp;
i++;
j--;
}
}while(i<=j); //如果两边扫描的下标交错,就停止(完成一次)
if(left<j) //当左边部分有值(left<j),递归左半边
{
QuickSort(pData,left,j);//当右边部分有值(right>i),递归右半边
}
if(right>i)
{
QuickSort(pData,i,right);
}
}
wangbinli89 2010-10-24
  • 打赏
  • 举报
回复
建议可以看一下清华大学出版社出版的严蔚敏的《数据结构》,那里面的P275页对快速排序有很详细的讲解。
并且给了伪代码,不过稍微改一下就可以运行了
shiweifu 2010-10-24
  • 打赏
  • 举报
回复
LZ试试我的代码:


#include <stdio.h>
#include <stdlib.h>

int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}


int main(int argc, char** argv)
{
int arr[] = {12,7,13,6,24,22,8,9,20,18};
int i = 0;
qsort(arr, sizeof(arr)/sizeof(int), sizeof(int), compare);


for(;
i < sizeof(arr)/sizeof(int);
i++)
{
printf("%d\n",arr[i]);
}

return 0;
}



估计交上去会挨骂
xt0601 2010-10-24
  • 打赏
  • 举报
回复
大哥们人家是作业,你们怎么给人家源码?!这样是害人家,你们要给人家说明快速排序的原理,有必要的话写几句重要的语句就行了!!
lazy_virus 2010-10-24
  • 打赏
  • 举报
回复
给代码吧
你输入n,代表要排序的个数,接着输入要排序的n个数!
你一步步运行下,应该可以得到答案的!
也是选择第一个元素作为pivot元素

#include<stdio.h>
void sort(int a[100],int left,int right)
{
int i,j,temp;

int p;

if(left<right){
i=left;j=right+1; p=a[left];
do
{

do i++;
while(a[i]<p);

do j--;
while(a[j]>p);

if(i<j)
{
temp=a[i];a[i]=a[j];a[j]=temp;
}
}while(i<j);

temp=a[left];
a[left]=a[j];
a[j]=temp;
sort(a,left,j-1);
sort(a,j+1,right);
}
}
main()
{
int i,j,n;
int a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
do__i 2010-10-24
  • 打赏
  • 举报
回复
为避免出现“蜕化”情形,通常依“三者取中”的规则选取枢轴(标兵)。
yg2362 2010-10-24
  • 打赏
  • 举报
回复

#include <stdio.h>
#define SUB_SEQU_LEN 3


void quicksort(int array[],int start,int end)
{
if ( start >= end )
return;

int low = start,high = end;
int pivot = array[low];
if ( high - low >= SUB_SEQU_LEN )
printf("%d\r\n",pivot);

while(low < high)
{
while(low < high && array[high] > pivot)
high -= 1;
array[low] = array[high];

while(low < high && array[low] < pivot)
low += 1;
array[high] = array[low];
}
array[low] = pivot;

if ( low > start )
quicksort(array,start,low - 1);

if ( high < end )
quicksort(array,high + 1,end);
}

int main()
{
int array[] = {12,7,13,6,24,22,8,9,20,18};
quicksort(array,0,sizeof(array)/sizeof(int) - 1);
}
do__i 2010-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangbinli89 的回复:]
建议可以看一下清华大学出版社出版的严蔚敏的《数据结构》,那里面的P275页对快速排序有很详细的讲解。
并且给了伪代码,不过稍微改一下就可以运行了
[/Quote]
曾经看过这本书。
ruanxuewu0120 2010-10-24
  • 打赏
  • 举报
回复
第一趟快速排序后的结果(以12为标兵):
9 7 8 6 12 22 24 13 20 18 得到长度大于等于3的序列是9 7 8 6 和22 24 13 20 18
对第二个序列进行快速排序,以22为标兵,得到的序列是18 20 13 22 24 得到长度大于等于3的序列是
18 20 13
所以题目答案是 9 7 8 6 和 22 24 13 20 18 和18 20 13

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧