赞
踩
/* 快速排序(考试重点) 一次划分(考试重点) */ #include<stdio.h> #include<stdlib.h> #include<assert.h> int Partition(int* arr, int low, int high)//一次划分:时间复杂度O(n),空间复杂度O(1) { int tmp = arr[low]; while (low < high) { while (low < high && arr[high] >= tmp) high--; arr[low] = arr[high];//没有加判断是因为哪怕经过--后,low==high,也是自己赋值给自己 while (low < high && arr[low] <= tmp) low++; arr[high] = arr[low]; } arr[low] = tmp; return low; } void Quick(int* arr, int low, int high)//快排:时间复杂度O(n*log(n)),最坏情况为O(n^2),,空间复杂度:O(log(n)) { int par = Partition(arr, low, high); if (low < par - 1)//书上是low<high,保证前半部分*至少有两个数字* { Quick(arr, low, par - 1); } if (par + 1 < high) { Quick(arr, par + 1, high); } } void QuickSort(int* arr, int len)//快排数据:顺序或倒序都是选择排序,且非常慢 {//越有序,越慢 Quick(arr, 0, len - 1); } //非递归的快排 void QuickSort1(int* arr, int len) { //创建一个栈,用于存放每个划分段的起始和结尾下标 int* index = (int*)malloc(len * sizeof(int));//空间复杂度变为O(n),不太好,可以使用STL中的stack assert(index != NULL); int top = 0;//栈顶指针 int low;//起始下标 int high;//结尾下标 //先入起始下标,再入结束下标 index[top++] = 0; index[top++] = len - 1; while (top > 0)//栈不空 { //先出结尾下标,再出起始下标 high = index[--top]; low = index[--top]; int par = Partition(arr, low, high); //如果左边超过一个数据,则继续入栈 if (low < par - 1) { index[top++] = low; index[top++] = par - 1; } //如果右边超过一个数据,则继续入栈 if (par + 1 < high) { index[top++] = par + 1; index[top++] = high; } } free(index); } int main() { int arr[] = { 6,4,8,9,2,1,5,6,7,8,9,10 }; int len = sizeof(arr) / sizeof(arr[0]); //QuickSort(arr, len); QuickSort1(arr, len); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。