| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1078 人关注过本帖
标题:[开源][求助]`~谁能给我讲讲这个快速排序算法
只看楼主 加入收藏
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
结帖率:66.67%
收藏
 问题点数:0 回复次数:11 
[开源][求助]`~谁能给我讲讲这个快速排序算法

`~谁能给我讲讲这个快速排序算法`````算法是这样的`:

这是`C.A.R.Hoare于1962年发明的```对一个给定的数组,从中选择一个元素,以该元素为界```将其他元素划分为两个子

集,一个子集中所有元素都小于该元素,另一个子集中的元素都大于或等于该元素.对这2个子集递折行这一过程,当某个子

集中的``的元素小于2时`,这个子集就不需要再次排序```终止递归``.


void qsort ( int v[], int left, int right )

{

int i, last ;

void swap ( int v[], int i,int j ) ;

if ( left>= right ) /* 若数组包含的元素少于2个 */
return ;

swap ( v, left, (left + right) / 2 ) ; /* 将划分子集的元素 */

last = left ; /* 移动V[0] */

for ( i = left+1; i <= right; i++ ) /* 划分子集 */
if (v[i] < v[align=left] )
swap (v, ++last, i);

swap ( v, left, last); /* 恢复划分子集的元素 */

qsort ( v, left, last-1 );

qsort ( v, last+1, right );
}

/* swap 函数: 交换v[i]和[j]值 */

void swap ( int v[], int i, int j )
{
int temp

temp = v[i] ;
v[i] = v[j] ;
v[j] = temp ;
}

我除了能看懂 SWAP 函数以外 ``其他什么都不懂``

后面跟的注释``更是不知道说的是什么意思``

leaft, right, last, 代表的是什么啊```

好晕啊```

给我讲讲```好不好``谢谢````


搜索更多相关主题的帖子: 算法 开源 
2007-06-19 14:54
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 

你这个程序看着有点晕,后面的注释也是怪怪的,我只知道如果是我写快速排序的话有两种方法:
1)两个变量一左一右,标志的是数组的下标,任取一个下标所在的存储单元里的数作为标准,这里以左为例,然后右标向左移当找到比左标小的数的时候交换,然后是左标向右移当找到比右边大的话交换,如此往复,当两标重合将数组一分为二,就第归,分别在左右两个区域重复上述工作。

2)四个变量,如:left,right,i,j,i和left指示最左边,j和right指示最右边,取中间的一个元素作标准,i++,j--,当i指示的元素大于标准数,j指示的元素小于标准数的时候i,j交换,如此往复直到i>j,则以left,j和i,right分别递归在左右两边重复以上工作。

可能这样说很难理解,本来我有个例子很好的也有图表述,但不知道怎么弄上来。


Viva,espana!
2007-06-19 17:09
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
写的很好的快速排序啊!

你理解快速排序的逻辑吗?我觉得你从逻辑进入代码比较好。
反着来……不好吧!

Fight  to win  or  die...
2007-06-19 17:17
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
这是书上代码``我就是怎么看也看懂``那些变量的意思也不明白``


女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-06-19 18:11
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

确定一个数作为划分的标准,使得这个数的左边都比这个数小(大),右边都比这个数大(小).
然后以这个数作为划分点,前面和后面继续做上面的操作,当且每次划分只剩两个元素时,就停止递归(因为两个数做划分已经就有序了).
由于每次做了一次划分使得待排序的规模可以减半.(当然考虑最好的情况了).
所以选择这个划分点很关键,通常做法是选择待排序元素的第一个.不过从效率上讲,随机产生下标更好一点.


倚天照海花无数,流水高山心自知。
2007-06-19 20:43
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
/********************************************************/
/* 快速排序 */
/********************************************************/
void Quick_Sort(list &a,int left,int right)
{
int i ,j;
if(left<right)
{
i=left;j=right;
int temp=a.data[i];//设定划分点
while(i!=j)//待排序元素的上下标
{
while(i<j&&temp>a.data[j])//右边找比划分元素大的元素
{
j--;
}
if(i<j)//将划分点替代这个空间,使得右边空出位子插入小的值
{
a.data[i]=a.data[j];
i++;
}
while(i<j&&temp<a.data[i])//左边找比划分元素小的元素

{
i++;
}
if(i<j)//将划分点替代这个空间,使得左边空出位子插入大的值
{
a.data[j]=a.data[i];
j--;
}
}
a.data[i]=temp;//将划分点放入
Quick_Sort(a,left,i-1);//左边做QSORT.
Quick_Sort(a,i+1,right);////右边做QSORT.
}
}

倚天照海花无数,流水高山心自知。
2007-06-19 20:55
zkkpkk
Rank: 2
等 级:论坛游民
威 望:5
帖 子:489
专家分:28
注 册:2006-6-17
收藏
得分:0 

这个好理解一点


//*******************************************************
//快速排序
//*******************************************************
#include <iostream.h>
const int MAX = 11;

//快速排序
void quick_sort(int list[MAX], int left, int right);
//交换数据
void swap(int& first, int& second);
//显示数据
void display(int a[], int length);

void main()
{
 int list[MAX];
 int count;

//输入数据
 for (count = 0 ; count < MAX ; count++)
 {
  cout << \"Enter value of element \" << count << \": \";
  cin >> list[count];
 }

 cout << \"\n\nBefore Quick Sort:\n\n\";
//输出排序前序列
 display(list,MAX);
//进行快速排序
 quick_sort(list, 0, MAX -1);
 cout << \"\nAfter Quick Sort:\n\n\";
//输出排序后序列
 display(list,MAX);
}

void quick_sort(int list[], int left, int right)
{
 int pivot, left_arrow, right_arrow; //标准数、左游标、右游标

//左游标指向最左右游标指向最右,取中间的元素作为标准数
 left_arrow = left;
 right_arrow = right;
 pivot = list[(left + right)/2];

//开始排序
do
 {
//左边的找到一个大于标准数的数
  while (list[right_arrow] > pivot)
   right_arrow--;
//右边的找到一个小于标准数的数
  while (list[left_arrow] < pivot)
   left_arrow++;

//交换数据并继续移动游标
   if (left_arrow <= right_arrow)
   {
    swap(list[left_arrow], list[right_arrow]);
    left_arrow++;
    right_arrow--;
   }
 }
 while (right_arrow >= left_arrow); //直到左右游标位置对调退出循环

//以最左端标识和右游标作为参数递归,在左半区重复以上工作
if (left < right_arrow)
   quick_sort(list, left, right_arrow);
//以左游标和最右端标识作为参数递归,在右半区重复以上工作
 if (left_arrow < right)
   quick_sort(list, left_arrow, right);
}

//交换数据
void swap(int& first, int& second)
{
 int temp = first;
 first = second;
 second = temp;
}

//显示数据
void display(int a[], int length)
{
 for (int count = 0 ; count < length ; count++)
  cout << a[count] << \" \";
  cout << \"\n\n\";
}

[此贴子已经被作者于2007-6-20 11:04:08编辑过]


Viva,espana!
2007-06-20 11:01
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
谢谢``大家```
我下来``好好``想想```


女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-06-20 19:26
killer_l
Rank: 2
等 级:新手上路
威 望:3
帖 子:1139
专家分:0
注 册:2007-5-25
收藏
得分:0 
学习中,问一下,快速排序的效率高么?

2007-06-20 19:57
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
选值恰当,就高!相对于其他简单排序!

Fight  to win  or  die...
2007-06-20 20:34
快速回复:[开源][求助]`~谁能给我讲讲这个快速排序算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021243 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved