这个代码为什么结果一直不对,会出来0 void Swap(int &a, int &b)//交换两个数的函数 int* New_Partition(int *A, int p, int r) //新的分区函数 int main() |
|
给个我之前写的快速排序代码,楼主参考下:
是用类模板写的,只要实现了比较运算的类型都支持 //快速排序(递归版) template<class T> class Quick : public Sort<T> { private: void QSort(T* a,int left,int right);//划分函数 public: Quick(T* arr,int len,bool sequen = true) : Sort<T>(arr,len,sequen){} virtual void sort(){if(len > 1) QSort(arr,0,len-1);} }; //快速排序(非递归版) template<class T> class Quick2 : public Sort<T> { private: int* stack; //创建一个栈的指针 int Partition(T* a,int left,int right);//划分函数 public: Quick2(T* arr,int len,bool sequen = true) : Sort<T>(arr,len,sequen){stack = NULL;} virtual ~Quick2(){delete[] stack;} virtual void Release(){delete[] stack; stack = NULL;} virtual void sort(); }; //快速排序(递归版)------------------------------------------------------------------------------- template<class T> void Quick<T>::QSort(T* a,int left,int right) { T tmp = a[left]; int p = left; int i = left,j = right; while(i<=j) { if(sequen) //升序 { while(a[j]>=tmp && j>=p) j--; if(j>=p) { a[p] = a[j]; //比划分元小的交换到左边 p = j; } while(a[i]<=tmp && i<=p) i++; if(i<=p) { a[p] = a[i]; //比划分元大的交换到右边 p = i; } } else //降序 { while(a[j]<=tmp && j>=p) j--; if(j>=p) { a[p] = a[j]; //比划分元大的交换到左边 p = j; } while(a[i]>=tmp && i<=p) i++; if(i<=p) { a[p] = a[i]; //比划分元小的交换到右边 p = i; } } }//end while(i<j) a[p] = tmp; if(p-left>1) QSort(a,left,p-1); if(right-p>1) QSort(a,p+1,right); } //快速排序(非递归版)----------------------------------------------------------------------------- template<class T> int Quick2<T>::Partition(T* a,int left,int right) { T pivot = a[right]; while(left<right) { if(sequen) //升序 { while(a[left]<pivot && left<right) left++; if(left<right) a[right--] = a[left]; while(a[right]>pivot && left<right) right--; if(left<right) a[left++] = a[right]; } else //降序 { while(a[left]>pivot && left<right) left++; if(left<right) a[right--] = a[left]; while(a[right]<pivot && left<right) right--; if(left<right) a[left++] = a[right]; } } a[left] = pivot; return left; } template<class T> void Quick2<T>::sort() { if(len <= 1) return; int left = 0; int right = len - 1; stack = new int[right-left+2]; //会浪费大量存储空间 int top = 0; int mid; stack[top++] = left; stack[top++] = right; while(top>0) { right = stack[--top]; left = stack[--top]; if(left<right) { mid = Partition(arr,left,right); if(mid-left > right-mid) { stack[top++] = left; stack[top++] = mid-1; if (right > mid) { stack[top++] = mid + 1; stack[top++] = right; } } else { stack[top++] = mid + 1; stack[top++] = right; if(mid > left) { stack[top++] = left; stack[top++] = mid - 1; } } } } delete[] stack; stack = NULL; } |
|
参考代码段
https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c |
|
你的程序确实挺好的,但是在一个序列中有很多元素相同的时候性能就不好, 我想做的是改进快排,把一个序列分成三个区域,中间的区域是和主元相同的元素,但是写出来运行结果很奇怪 |
|
Swap函数错了。不要这么高大上,就用最简单最入门的交换即可。
或者这样改一下 void Swap(int &a, int &b)//交换两个数的函数 { if (a != b) // 加上这一行 { a+=b; b=a-b; a-=b; } } |
|
当调用Swap(a[i], a[j])的时候,如果i刚好等于j,那Swap进来的两个引用实际上是同一个地址,a+=b的时候实际上是把a和b一起改了,
|
|
20分 |
还有两个小问题:
srand在main里面调用一次即可,不要多次调用。 只有malloc没有free,虽然在这个小程序里面不会造成内存泄漏,但是这个习惯不太好 |
谢谢指导,菜鸟受教了 |
|
还想问你下 像这种malloc分配内存的变量作为返回值返回了,在什么地方释放呢 |
|
分配的内存,应该是用完之后马上释放。
int *new_index= New_Partition(A, p, r); QuickSort(A, p, new_index[0]-1); QuickSort(A, new_index[1]+1, r); free(new_index); // 在这里释放 其实这种情况应该尽量避免,因为有个原则是“谁分配,谁释放”,分配和释放最好在同一个函数里面,这样不容易出错。遇到有些情况必须这么做的,那就只好加倍小心了。 |
|
哦哦 感觉平时写算法导论习题的时候很难想到这些 |