- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Xcode 中遇到一些奇怪的错误 - 线程 1:在下面的代码段中的 EXC_BAD_ACCESS
while(*w1 != '\0' && *w2 != '\0')
这里是快速排序的实现和比较方法:
void quicksort(char ***words, int start, int end){ //start is pivot
if(start >= end){
return;
}
int left = start;
int right = end;
int comp;
while( left <= right ){
do{
char* w1 = (*words)[++left];
char* w2 = (*words)[start];
comp = compare(w1, w2);
}while(comp < start); //while current left less than pivot
do{
char* w1= (*words)[--right];
char* w2= (*words)[start];
comp = compare(w1, w2);
}while(comp >= start); //while current right is more or equal to pivot
if(left < right){
swap(words, left, right);
}
}
swap(words, start, --left);
quicksort(words, 0, left-1);
quicksort(words, left+1, end);
}
int compare(char *w1, char *w2){
while(*w1 != '\0' && *w2 != '\0'){
if( *w1 < *w2 ){
return -1;
}else if( *w1 > *w2 ){
return 1;
}else{
w1++;
w2++;
}
}
if(*w1 == *w2)
return 0;
else if(*w1 == '\0')
return -1;
else return 1;
}
这是完整代码 http://ideone.com/MZFaFO
我假设问题的原因可能在 do-while 之间。我用指针做的很糟糕..我将非常感谢你的帮助。我刚开始学习 C,它完全杀死了我。 :(
最佳答案
有很多错误(稍后会详细介绍),但我必须以这个开头:
不要为快速排序实现传递右/左索引标记。你不需要它们,它们给通用算法带来的复杂性是不值得的。这是 C。这样你就可以免费进行指针运算。用它; Revel 其中。这样一来,您的算法就减少到一个完成偏移魔术的地方。剩下的就变得微不足道了。
但首先,从您的比较器开始,进行一些一般性的内务处理。这是否更简单,由您来判断:
int compare(char const *w1, char const *w2)
{
while(*w1 && *w2)
{
if (*w1 < *w2)
return -1;
if (*w2++ < *w1++)
return 1;
}
return *w2 ? -1 : (*w1 != 0);
}
这里唯一值得一提的是最后一个子句,它说:“如果我们完成 w2
仍然指向某物,它必须比 w1
长,所以 w1
是“less”,我们返回 -1。否则,w2
必须在字符串末尾,所以如果 w1
是,则返回 1不是(因此“更大”),否则返回 0(它们都在字符串末尾)。
关于 swap
元素。您所做的只是交换指针数组中的指针 值(地址)。因此……
void swap_ptrs(char **lhs, char **rhs)
{
char *tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}
关于您的问题的实质(有多个)。首先,您到底想用这个完成什么:
do{
char* w1 = (*words)[++left];
char* w2 = (*words)[start];
comp = compare(w1, w2);
}while(comp < start)
start
是指针数组的索引,comp
是比较的结果。它不返回索引,它返回 -1
、0
或 1
。他们之间确实没有关系。同样的问题发生在你的第二个 while 循环中。此外,您正在递增 left
(并在另一个循环中递减 right
)过早地。简而言之,这根本无法快速排序
。
利用前面提到的指针数学以及提供的比较器和交换例程,这是一种对相关分区进行快速排序的方法。请注意,我们只需要两个参数:数组的基地址和我们希望排序的序列的长度。递归使用指针算法在需要时提供正确的起点和长度。
void quicksort(char **words, size_t len)
{
if (len < 2)
return;
char const *pvt = words[len/2];
size_t lhs = 0, rhs=len-1;
while( lhs < rhs )
{
while (compare(words[lhs], pvt) < 0)
++lhs;
while (compare(words[rhs], pvt) > 0)
--rhs;
if (lhs <= rhs)
swap_ptrs(words+lhs++, words+rhs--);
}
quicksort(words, rhs+1);
quicksort(words+lhs, len-lhs);
}
为了测试这个,一个简单的 random-string-generationg 实现:
int main()
{
srand((unsigned int)time(NULL));
// allocate a string bed of 100 pointers
static const size_t len = 100;
char **arr = malloc(sizeof(*arr) * len);
// populate with random strings ranging from 5 to 8 chars.
for (size_t i=0; i<len; ++i)
{
int siz = 5 + rand() % 4;
arr[i] = malloc(siz+1);
for (size_t j=0; j<siz; ++j)
arr[i][j] = 'A' + rand() % 26;
arr[i][siz] = 0;
}
quicksort(arr, len);
for (size_t i=0; i<len; ++i)
{
printf("%s\n", arr[i]);
free(arr[i]);
}
free(arr);
}
输出(显然不同)
ARSXTGA
ATQYX
BCFNHSN
BEDYEW
BGTYDCK
BSYNEB
BYQXH
BYXVID
CHXQVEVG
CLRLYLO
DEXTPQO
DXHAIP
ECLMAD
EPYCQJ
EPZGNCG
EUUWTXOI
FEABB
FFMCTK
FYOIIKX
FZQWIQ
GDDUOMO
GFJNWEKP
GGMHDPA
GQMSEU
HTPCU
HULIENC
IGNHGIMM
ITFPMUAM
IYHBOWJ
IYTDAOEE
JEQVXRZ
JMUCWRV
JUDMWMS
KHVKN
KJOJXNL
KQIVURG
KVIGK
KVUYIER
LACVY
LCEKGER
LGELOIY
MILDEFJI
MNZDX
MOBOAPYL
MOLDKACO
MUJXDGH
NDZZLRQD
NEZTSBPC
NLDHM
OAZSW
OLPKKL
OZOBK
PBIOISM
PCYHNYQ
PEZMH
PFWEJQI
PIXNQ
PZATCAIK
QJUYGNID
QKGDXI
QLGORE
QULGW
RBEDK
ROYSAPGH
RQTVMO
RTBGDBXM
SLHUOE
SLTBOETM
SNRIGY
SRBPOF
STGPU
STUOQ
SXZFPRR
TBRFT
TELZYQ
TJKWLLE
TKLSNN
TNATOPFQ
UJXGWM
UNQZSF
VCLZUWSV
VPJVAEP
WBVBY
WDVWTEF
WEPRL
WFTJSFIQ
WUIJQS
WWPOAQQ
XLASZMI
XOQTSPZ
XQZZSZ
YFHXA
YFXMKAC
YPPUC
YRLVS
YTGHWVU
YWXOWXL
ZLVTUL
ZUNMCE
ZUUQZXLX
关于c - 需要帮助查找 C 中快速排序实现错误的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874209/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!