среда, 25 июня 2025 г.

Сортировки выбором, слиянием и пирамидальная, быстрая на Си

 /**********
* Сортировки выбором, слиянием и
* пирамидальная, быстрая на Си
* evgeniy-korniloff@yandex.ru
* 2025
*****************/


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int v[],int a,int b){ int t = v[a];v[a]=v[b];v[b]=t;}
void init_rnd(int v[],int n, int max){
     srand(time(0));
     while(--n>=0)v[n]=rand()%(max+1);
}
void print_arr(int v[],int n){
     int j;
     for(j=0;j<n;j++)
       printf("%d, ",v[j]);
     printf("\n"); 
}
int check_array(int v[],int n){
     int j;
     for(j=0;j<n-1;j++)
       if(v[j]<v[j+1])return 0;
     return 1;
}

//////
int foo=0;
void sort_buble(int v[],int n){
  int j,k,find;
  for(j=0;j<n;j++)
  {
    find=0;
    for(k=n-1;k>j;k--)
    {
      if(v[k]>v[k-1]){
        swap(v,k,k-1);
        find=1;
                //??
        foo++;    

      }
    }
    if(!find) return;
  }
}
void QsortHelper(int v[],int a,int b, int min, int max){
  void sort_buble(int v[],int n);
  int mid,k,j;
  if(b-a<5 || max-min<3){
    sort_buble(&v[a],b-a+1);
    return;
  } 
  mid = min + (max-min)/2;
  k=a;
  for(j=a;j<=b;j++){
    if(v[j]>mid) swap(v,k++,j);
  }
  QsortHelper(v,a,k-1,mid+1,max);
  QsortHelper(v,k,b,min,mid);
  
}

void Qsort(int v[],int n){
 int j,min,max;
  if(n<2) return;
  min=max=v[0];
  for(int j=0;j<n;j++){
    if(v[j]<min){ min=v[j];}
    if(v[j]>max){ max=v[j];}
  }
  QsortHelper(v,0,n-1,min,max);
}
//////////
void sort_vibor(int v[],int n){
    int j,k,max,max_i;
     for(j=0;j<n-1;j++){
       max=v[j]; max_i=j;  
       for(k=j+1;k<n;k++){
          if(v[k]>max){
             max=v[k];
             max_i=k;  
          } 
       }  
       if(max_i!=j) swap(v,j,max_i);
     }
}
///////////
void sort_sliyaniem(int v[], int n){
 if(n<6) sort_vibor(v,n);
 else{
   int j,i,q,w,e;
   int d = n/2+1;
   int a[d], b[d];
   for(j=0;j<d;j++) a[j]=v[j];
   for(j=d,i=0; j<n; j++,i++) b[i]=v[j];
   sort_sliyaniem(a,d);
   sort_sliyaniem(b,i);
   for(q=0,w=0,e=0;q<d && w<i;){
     if(a[q]>b[w]){
       v[e++] = a[q++];
     }else{
       v[e++] = b[w++];
     }
   }
   while(q<d) v[e++] = a[q++];
   while(w<i) v[e++] = b[w++];

 }
}

void heap_sort_shift_down(int v[],int b, int n){
  int j,i,max_i;
  do{
    j = b*2 + 1;
    i = b*2 + 2;
    if(j>=n && i>=n) return;
    if(j>=n) max_i=i;
    else if(i>=n) max_i=j;
    else max_i = v[j]>v[i]? j:i;
    if(v[max_i] <= v[b]) return;
    swap(v,b,max_i);
    b = max_i;
   }while(1);
}
//один лучший гарантированно наверх
void heap_sort(int v[],int n){
 int b;
 for(b=n/2+1;b>=0;b--)
   heap_sort_shift_down(v,b,n);

}
int pick(int v[],int *N,int *best){
  int n = *N;
  if(n<=0)return 0;
  if(n==1){*best=v[0];(*N)--;return 1;};
  *best = v[0];
  v[0] = v[n-1];
  heap_sort_shift_down(v,0,n-1);
  (*N)--;
  *best = v[0];
  return 1;

}

#define N 2000000
int v[N];

int main(){
  init_rnd(v,N,N);
  //sort_buble(v,N);
  Qsort(v,N);
 /***
 do{
      heap_sort(v,N);
      int n = N,best;
      while(n>0){
        pick(v,&n,&best);
        printf("%d, ",best);
      }
      printf("\n");
  }while(0);
  ***/
 // print_arr(v,N);
  printf("check_array: %d\n", check_array(v,N));
  printf("? %d\n",foo);
  return 0;  
}

Комментариев нет:

Отправить комментарий