/******************************** * 快速排序算法 * *********************************/ #include <stdio.h> /****************************** * 一次划分算法 * pList 需要排序的数组 * nLow 起始位置 * nHigh 结束位置 *****************************/ int Partiton(int *pList,int nLow,int nHigh) { int nTmp = pList[nLow]; while(nLow < nHigh) { while(nLow < nHigh && nTmp <= pList[nHigh]) { nHigh--; } pList[nLow] = pList[nHigh]; while(nLow < nHigh && nTmp >= pList[nLow]) { nLow++; } pList[nHigh] = pList[nLow]; } pList[nLow] = nTmp; return nLow; } /************************** * 使用Partition进行快速排序 * * 递归实现 **************************/ void QuickSort(int *pList,int nLow, int nHigh) { int nPivotLoc; if(nLow < nHigh) { nPivotLoc = Partiton(pList, nLow, nHigh); QuickSort(pList, nLow, nPivotLoc - 1); QuickSort(pList, nPivotLoc + 1, nHigh); } } /****************************** * * 非递归实现 * ******************************/ void Sort(int *pList, int nLow, int nHigh) { int *pPosArr = (int *)malloc((nHigh - nLow + 1)*sizeof(int)); int nPos = 0; int nTmpLow; int nTmpHigh; int nPivotLoc; pPosArr[nPos++] = nLow; pPosArr[nPos++] = nHigh; while(nPos > 0) { nTmpHigh = pPosArr[--nPos]; nTmpLow = pPosArr[--nPos]; if(nTmpLow >= nTmpHigh) { break; } nPivotLoc = Partiton(pList, nTmpLow, nTmpHigh); if(nPivotLoc - 1 > nTmpLow) { pPosArr[nPos++] = nLow; pPosArr[nPos++] = nPivotLoc - 1; } if(nPivotLoc + 1 < nTmpHigh) { pPosArr[nPos++] = nPivotLoc + 1; pPosArr[nPos++] = nHigh; } } free(pPosArr); } /****************************** * 测试函数 * *****************************/ int main(void) { int nList[] = {49, 38, 65, 97, 76, 13, 27, 49}; int i; Sort(nList,0,sizeof(nList)/sizeof(int) - 1); for(i = 0; i < 8; i++) { printf("%d ",nList[i]); } putchar('\n'); return 0; }