《大话数据结构》之快速排序
2016-02-27 02:32
393 查看
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LEN 256
typedef struct
{
int iInput[MAX_LEN];
int iLength;
}SqArr;
void swap(SqArr *pToSwap,int iFirst,int iSecond)
{
if (iFirst != iSecond)
{
pToSwap->iInput[iFirst] = pToSwap->iInput[iFirst] + pToSwap->iInput[iSecond];
pToSwap->iInput[iSecond] = pToSwap->iInput[iFirst] - pToSwap->iInput[iSecond];
pToSwap->iInput[iFirst] = pToSwap->iInput[iFirst] - pToSwap->iInput[iSecond];
}
}
int Output(SqArr *pSqToPrint)
{
int iLoop;
for(iLoop=1;iLoop<=pSqToPrint->iLength;iLoop++)
{
printf("%d ",pSqToPrint->iInput[iLoop]);
}
printf("\n");
return 0;
}
/*
此种写法有很大的缺陷,
选low值最为基值,必须先移动high指针,
选high值为基值,必须先移动low指针
*/
int Partion(SqArr *pSqArrToSort,int iLow,int iHigh)
{
int iKey = 0;
iKey = pSqArrToSort->iInput[iLow];
while(iLow < iHigh)
{
while(iLow<iHigh && pSqArrToSort->iInput[iHigh]>=iKey)
{
iHigh = iHigh - 1;
}
swap(pSqArrToSort,iLow,iHigh);
while(iLow<iHigh && pSqArrToSort->iInput[iLow]<=iKey)
{
iLow = iLow + 1;
}
swap(pSqArrToSort,iLow,iHigh);
}
return iLow;
}
/*
这个写法也有局限性
如果选择low值为key值,需要做出改动
*/
int Partion_L2(SqArr *pSqArrToSort,int iLow,int iHigh)
{
int iIndex = iLow - 1;
int iLoop = iLow;
int iKey = pSqArrToSort->iInput[iHigh];
for(;iLoop<iHigh;iLoop++)
{
if(pSqArrToSort->iInput[iLoop]<iKey)
{
iIndex = iIndex + 1;
swap(pSqArrToSort,iLoop,iIndex);
}
}
swap(pSqArrToSort,iIndex+1,iHigh);
return iIndex + 1;
}
void QuickSort(SqArr *pSqArrToSort,int low,int high)
{
int iPivot;
if(low < high)
{
iPivot = Partion_L2(pSqArrToSort,low,high);
QuickSort(pSqArrToSort,low,iPivot-1);
QuickSort(pSqArrToSort,iPivot+1,high);
}
}
int main()
{
char strInput[MAX_LEN];
char *pStrInput = NULL;
char *pStrtok = NULL;
int iLoop;
SqArr iToSort;
memset(strInput,0x00,sizeof(strInput));
memset(&iToSort,0x00,sizeof(SqArr));
printf("%s","请输入待排序数据,以逗号分隔,以回车结束:\n");
scanf("%s",&strInput);
pStrInput = strInput;
for(iLoop=1;;iLoop++,pStrInput=NULL)
{
pStrtok = strtok(pStrInput,",\n");
if(NULL == pStrtok)
{
break;
}
iToSort.iInput[iLoop] = atoi(pStrtok);
iToSort.iLength = iLoop;
}
QuickSort(&iToSort,1,iToSort.iLength);
Output(&iToSort);
//getchar();
system("PAUSE");
return 0;
}
int Partion_L2(SqArr *pSqArrToSort,int iLow,int iHigh)
这个函数的思想,取自《算法导论》第三版
这个函数也是有缺陷的:如果选择low值为key值,当前的代码是不适用的,需要调整。
int Partion(SqArr *pSqArrToSort,int iLow,int iHigh)
这个划分的方式也有缺陷:
选low值最为基值,必须先移动high指针
选high值为基值,必须先移动low指针
#include <string.h>
#include <stdlib.h>
#define MAX_LEN 256
typedef struct
{
int iInput[MAX_LEN];
int iLength;
}SqArr;
void swap(SqArr *pToSwap,int iFirst,int iSecond)
{
if (iFirst != iSecond)
{
pToSwap->iInput[iFirst] = pToSwap->iInput[iFirst] + pToSwap->iInput[iSecond];
pToSwap->iInput[iSecond] = pToSwap->iInput[iFirst] - pToSwap->iInput[iSecond];
pToSwap->iInput[iFirst] = pToSwap->iInput[iFirst] - pToSwap->iInput[iSecond];
}
}
int Output(SqArr *pSqToPrint)
{
int iLoop;
for(iLoop=1;iLoop<=pSqToPrint->iLength;iLoop++)
{
printf("%d ",pSqToPrint->iInput[iLoop]);
}
printf("\n");
return 0;
}
/*
此种写法有很大的缺陷,
选low值最为基值,必须先移动high指针,
选high值为基值,必须先移动low指针
*/
int Partion(SqArr *pSqArrToSort,int iLow,int iHigh)
{
int iKey = 0;
iKey = pSqArrToSort->iInput[iLow];
while(iLow < iHigh)
{
while(iLow<iHigh && pSqArrToSort->iInput[iHigh]>=iKey)
{
iHigh = iHigh - 1;
}
swap(pSqArrToSort,iLow,iHigh);
while(iLow<iHigh && pSqArrToSort->iInput[iLow]<=iKey)
{
iLow = iLow + 1;
}
swap(pSqArrToSort,iLow,iHigh);
}
return iLow;
}
/*
这个写法也有局限性
如果选择low值为key值,需要做出改动
*/
int Partion_L2(SqArr *pSqArrToSort,int iLow,int iHigh)
{
int iIndex = iLow - 1;
int iLoop = iLow;
int iKey = pSqArrToSort->iInput[iHigh];
for(;iLoop<iHigh;iLoop++)
{
if(pSqArrToSort->iInput[iLoop]<iKey)
{
iIndex = iIndex + 1;
swap(pSqArrToSort,iLoop,iIndex);
}
}
swap(pSqArrToSort,iIndex+1,iHigh);
return iIndex + 1;
}
void QuickSort(SqArr *pSqArrToSort,int low,int high)
{
int iPivot;
if(low < high)
{
iPivot = Partion_L2(pSqArrToSort,low,high);
QuickSort(pSqArrToSort,low,iPivot-1);
QuickSort(pSqArrToSort,iPivot+1,high);
}
}
int main()
{
char strInput[MAX_LEN];
char *pStrInput = NULL;
char *pStrtok = NULL;
int iLoop;
SqArr iToSort;
memset(strInput,0x00,sizeof(strInput));
memset(&iToSort,0x00,sizeof(SqArr));
printf("%s","请输入待排序数据,以逗号分隔,以回车结束:\n");
scanf("%s",&strInput);
pStrInput = strInput;
for(iLoop=1;;iLoop++,pStrInput=NULL)
{
pStrtok = strtok(pStrInput,",\n");
if(NULL == pStrtok)
{
break;
}
iToSort.iInput[iLoop] = atoi(pStrtok);
iToSort.iLength = iLoop;
}
QuickSort(&iToSort,1,iToSort.iLength);
Output(&iToSort);
//getchar();
system("PAUSE");
return 0;
}
int Partion_L2(SqArr *pSqArrToSort,int iLow,int iHigh)
这个函数的思想,取自《算法导论》第三版
这个函数也是有缺陷的:如果选择low值为key值,当前的代码是不适用的,需要调整。
int Partion(SqArr *pSqArrToSort,int iLow,int iHigh)
这个划分的方式也有缺陷:
选low值最为基值,必须先移动high指针
选high值为基值,必须先移动low指针
相关文章推荐
- 快速排序
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#快速排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C++快速排序的分析与优化详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- php简单实现快速排序的方法
- Java 快速排序(QuickSort)原理及实现代码
- 快速排序和分治排序介绍
- java 算法之快速排序实现代码
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort