您的位置:首页 > 运维架构 > Linux

经典快速排序,linux纯C实现。注意swap方法,并且这个算法还需再敲写15篇。

2013-10-24 20:50 671 查看
代码可在anycodes在线编译测试

#include <stdio.h>
void swap(int* a, int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
int partition(int* a, int fI, int lI)
{
int i = fI-1, j = 0;
for(j=fI;j<=lI;j++)
{
if(*(a+j) < *(a+lI))
{
i++;
if(i != j) swap(a+j, a+i);
}
}
if(i+1 != lI)	swap(a+i+1, a+lI);
return i+1;
}
void quickSort(int* a, int fI, int lI)
{
int partI = 0;
if(fI >= lI)
return;
partI = partition(a, fI, lI);
quickSort(a, fI, partI-1);
quickSort(a, partI+1, lI);
}
int main()
{
int a[10] = {241,325425,56765,234,13,34574,4653,5687689,432552,2789};
int L = sizeof(a) / sizeof(int);
int i = 0;
quickSort(a, 0, L-1);
for(;i<L;i++)
printf("%d ", *(a+i));
printf("\n");
return 0;
}


注意程序中的swap方法是通过指针传递的,所以传递进去的两个指针不能是同一个地址,否则,这个地址中的元素值将变成0,所以本程序中在使用是都判断了是否是同一地址。

经过思考后,把swap进行了简单的修改:

void swap(int* a, int* b)
{
if(a == b)
return;
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}


这样不用担心a和b为同一地址后,地址中的数据丢失成0.所以源程序也就修改为:

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

void quickSort(int* a, int left, int right);
int partition(int* a, int left, int right);
void swap(int* a, int* b);

int main(int argv, char** argc)
{
int a[6] = {4, 1, 5, 2, 6, 3};
int len = sizeof(a) / sizeof(int);
quickSort(a, 0, len-1);
for(int i=0;i<len;++i)
printf("%d ", *(a+i));
printf("\n");
return 0;
}

void quickSort(int* a, int left, int right)
{
if(left >= right) return;
int partIndex = partition(a, left, right);
quickSort(a, left, partIndex-1);
quickSort(a, partIndex+1, right);
}

int partition(int* a, int left, int right)
{
int len = right - left;
int storeIndex = left;
int i = 0;
for(i=left;i<=right;++i)
{
if(*(a+i) < *(a+right))
{
swap(a+i, a+storeIndex);
storeIndex ++;
}
}
swap(a+storeIndex, a+right);
return storeIndex;
}

void swap(int* a, int* b) { if(a == b) return; *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序 算法 linux C
相关文章推荐