经典快速排序,linux纯C实现。注意swap方法,并且这个算法还需再敲写15篇。
2013-10-24 20:50
531 查看
代码可在anycodes在线编译测试
注意程序中的swap方法是通过指针传递的,所以传递进去的两个指针不能是同一个地址,否则,这个地址中的元素值将变成0,所以本程序中在使用是都判断了是否是同一地址。
经过思考后,把swap进行了简单的修改:
这样不用担心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; }
#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; }
相关文章推荐
- 曾经遇到的一个面试题,快速排序用链表实现,算法和以前的相似,需要注意一些细节处理
- [算法入门]快速排序非递归方法(Java实现),大家一起来找茬啊~
- 白话经典算法系列之六 快速排序 快速搞定
- 快速排序的两种改进方法算法及topK问题求解
- python 算法 排序实现快速排序
- 算法外功修炼之一 快速排序的Java实现
- 经典内部排序算法学习总结(算法思想、可视化、Java代码实现、改进、复杂度分析、稳定性分析)
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 白话经典算法系列之二 直接插入排序的三种实现
- 白话经典算法系列之五 归并排序的实现(讲的真好)
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 快速排序的递归实现算法。
- 白话经典算法系列之六 快速排序 快速搞定
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 白话经典算法系列之六 快速排序 快速搞定
- 经典算法之快速排序的C实现方法