快速排序(非递归)
来源:互联网 发布:js修改class属性名称 编辑:程序博客网 时间:2024/05/17 09:14
以下代码经测试,排序5000000(五千万)int型数据没有问题!
第一个参数是数组首地址
第二个参数是数组元素个数
第二个参数是数组元素个数
typedef struct _BUFF { int *LeftBuff; int *RightBuff; DWORD number;//有多少个 struct _BUFF *next;}BUFF;void QuickSort(int * const arr, DWORD number)//快速排序{ int tmp; int key; DWORD left, right; DWORD tmpLeft, tmpRight; BUFF *p = NULL; BUFF buff = {NULL, NULL, 0, NULL}; buff.LeftBuff = (int *)malloc(1024*1024*sizeof (int)); buff.RightBuff = (int *)malloc(1024*1024*sizeof (int)); if ((NULL == buff.LeftBuff) || (NULL == buff.LeftBuff)) { free(buff.LeftBuff); free(buff.LeftBuff); printf("分配缓存出错!\n"); return; } buff.LeftBuff[buff.number] = 0; buff.RightBuff[buff.number] = number-1; buff.number++; p = &buff; while (buff.number/* && (NULL == buff.next)*/) { tmpLeft = p->LeftBuff[p->number-1]; tmpRight = p->RightBuff[p->number-1]; left = tmpLeft; right = tmpRight; key = arr[left++]; do { while ((arr[left] < key) && (left < tmpRight)) { left++; } while ((arr[right] >= key) && (right > tmpLeft)) { right--; } if (left < right) { tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; } } while (left < right); tmp = arr[right]; arr[right] = arr[tmpLeft]; arr[tmpLeft] = tmp; if (p->number >= 1024*1024-1) { p->next = (BUFF *)malloc(sizeof (BUFF)); if (NULL != p->next) { p = p->next; p->LeftBuff = (int *)malloc(1024*1024*sizeof (int)); p->RightBuff = (int *)malloc(1024*1024*sizeof (int)); p->number = 0; p->next = NULL; } if ((0 != p->number) || (NULL == p->LeftBuff) || (NULL == p->RightBuff)) { printf("分配缓存出错!\n"); while (NULL != buff.next) { p = buff.next; do { p = p->next; } while (NULL != p->next); free(p); } getch(); return; } } else { p->number--; } if (tmpLeft+1 < right) { p->LeftBuff[p->number] = tmpLeft; p->RightBuff[p->number] = right-1; p->number++; } if (tmpRight > left) { p->LeftBuff[p->number] = left; p->RightBuff[p->number] = tmpRight; p->number++; } if ((0 == p->number) && (NULL != buff.next)) { p = &buff; while (NULL == p->next->next) { p = p->next; } free(p->next); p->next = NULL; } }}
测试代码:
#include <stdio.h>#include <conio.h>#include <windows.h>typedef struct _BUFF { int *LeftBuff; int *RightBuff; DWORD number;//有多少个 struct _BUFF *next;}BUFF;void QuickSort(int * const arr, DWORD number);//快速排序void ExamineArr(const int * const arr, DWORD number);//检查排序结果int main(int argc, char *argv[]){ DWORD StartTime, EndTime; DWORD i; DWORD num = 50000000; int *arr = NULL; arr = (int *)malloc(num * sizeof (int)); if (NULL == arr) { free(arr); printf("内存分配失败,程序退出!\n"); getch(); return -1; } StartTime = GetTickCount(); for (i=0; i<num; i++) { *(arr+i) = rand(); } EndTime = GetTickCount(); printf("生成%u个随机数耗时:%ums\n", num, EndTime - StartTime); StartTime = GetTickCount(); QuickSort(arr, num); EndTime = GetTickCount(); printf("快速排序耗时:%ums\n", EndTime - StartTime); ExamineArr(arr, num);//检查排序结果 free(arr); getch(); return 0;}void QuickSort(int * const arr, DWORD number)//快速排序{ int tmp; int key; DWORD left, right; DWORD tmpLeft, tmpRight; BUFF *p = NULL; BUFF buff = {NULL, NULL, 0, NULL}; buff.LeftBuff = (int *)malloc(1024*1024*sizeof (int)); buff.RightBuff = (int *)malloc(1024*1024*sizeof (int)); if ((NULL == buff.LeftBuff) || (NULL == buff.LeftBuff)) { free(buff.LeftBuff); free(buff.LeftBuff); printf("分配缓存出错!\n"); return; } buff.LeftBuff[buff.number] = 0; buff.RightBuff[buff.number] = number-1; buff.number++; p = &buff; while (buff.number/* && (NULL == buff.next)*/) { tmpLeft = p->LeftBuff[p->number-1]; tmpRight = p->RightBuff[p->number-1]; left = tmpLeft; right = tmpRight; key = arr[left++]; do { while ((arr[left] < key) && (left < tmpRight)) { left++; } while ((arr[right] >= key) && (right > tmpLeft)) { right--; } if (left < right) { tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; } } while (left < right); tmp = arr[right]; arr[right] = arr[tmpLeft]; arr[tmpLeft] = tmp; if (p->number >= 1024*1024-1) { p->next = (BUFF *)malloc(sizeof (BUFF)); if (NULL != p->next) { p = p->next; p->LeftBuff = (int *)malloc(1024*1024*sizeof (int)); p->RightBuff = (int *)malloc(1024*1024*sizeof (int)); p->number = 0; p->next = NULL; } if ((0 != p->number) || (NULL == p->LeftBuff) || (NULL == p->RightBuff)) { printf("分配缓存出错!\n"); while (NULL != buff.next) { p = buff.next; do { p = p->next; } while (NULL != p->next); free(p); } getch(); return; } } else { p->number--; } if (tmpLeft+1 < right) { p->LeftBuff[p->number] = tmpLeft; p->RightBuff[p->number] = right-1; p->number++; } if (tmpRight > left) { p->LeftBuff[p->number] = left; p->RightBuff[p->number] = tmpRight; p->number++; } if ((0 == p->number) && (NULL != buff.next)) { p = &buff; while (NULL == p->next->next) { p = p->next; } free(p->next); p->next = NULL; } }}void ExamineArr(const int * const arr, DWORD number){ DWORD i=0, j=1; if (number <2) { return; } for (; j<number; i++,j++) { if (arr[i] > arr[j]) { printf("第%u个数大于第%u个数!\n", i, j); return; } }}
- 快速排序(非递归)
- 快速排序(递归和非递归)
- 快速排序(递归和非递归)
- 快速排序实现(递归+非递归)
- 快速排序(递归+非递归)
- 快速排序----非递归
- 快速排序 非递归
- 非递归快速排序
- 快速排序 非递归
- 快速排序非递归
- 快速排序Java源码(递归和非递归)
- 快速排序Java源码(递归和非递归)
- 交换类排序:冒泡,快速(递归与非递归)
- 快速排序C++实现(递归,非递归)
- 非递归快速排序算法
- 快速排序非递归算法
- 快速排序非递归算法
- 快速排序非递归方法
- 一次性创建多个文件夹
- 实现多线程同步的三种方法及示例
- 一次性删除多个文件夹
- Response对象
- Android长度单位详解(dp、sp、px、in、pt、mm、dip)(转)
- 快速排序(非递归)
- SOLID(OOD)
- 2011总结
- Clone Object as instance in OgreMax
- 标准←→管理
- txt文件导入到sql
- 一个内存的独白(CSDN独家解密)
- 我是一个硬盘......(CSDN独家解密)
- 传智播客——学前基础1、2总结—1