quick_sort & heap_sort
quick_sort 分析: 核心在于partition函数的实现,partition可以实现很好的分界,然后递归即可。
非递归,可以考虑用栈来或者queue来保存每次的边界,依次partition。
- int partition(vector<int>&input,int st,int en) {
- int i = st;
- int j = en + 1;
- int key = input[st];
- while(i<j) {
- do{i++;}while(i<j && input[i]<key); //避免数组溢出,可以用边界隔离,或者在最后面加入一个最大值INT_MAX
- do{j--;}while(input[j]>key);
- if(i>=j) break;
- std::swap(input[i],input[j]);
- }
- std::swap(input[st],input[j]);
- return j;
- }
- void quick_sort(vector<int> & input,int st,int en) {
- if(st>=en) return;
- int mid = partition(input,st,en);
- quick_sort(input,st,mid-1);
- quick_sort(input,mid+1,en);
- }
heap_sort
- #include <iostream>
- #include <vector>
- using namespace std;
- void adjust_down(int *const &array,int pos,int len);//向前声明
- // void adjust_down(int (&array)[6],int pos,int len)
- void make_heap(int*const &array,int len);
- void swap(int* const &array,int i,int j){//为了用临时变量的指针,必须让该指针为常量引用
- int tmp = array[i];
- array[i] = array[j];
- array[j] = tmp;
- }
- void heap_sort(int* const &array,int len){
- int real = len - 1;
- make_heap(array,real);
- for(int i=real;i>1;i--){
- swap(array,i,1);
- real--;
- adjust_down(array,1,real);
- }
- }
- void make_heap(int* const &array,int len){
- for(int i=len/2;i>=1;i--){
- adjust_down(array,i,len);
- }
- }
- void adjust_down(int* const&array,int pos,int len){
- while(2*pos<=len){
- int min=0;
- if(2*pos+1>len) min = 2*pos;
- else {
- min = array[2*pos]>array[2*pos+1]?2*pos+1:2*pos;
- }
- if(array[min]<array[pos]) {
- swap(array,min,pos);
- pos = min;
- }else break; //满足条件则终止
- }
- }
- int main(){
- int array[]={0,1,3,4,5,2};
- heap_sort(array,6); //把数组变成临时变量指针
- for(int i=1;i<6;i++) cout<<array[i];
- cout<<endl;
- return 0;
- }

浙公网安备 33010602011771号