/**********
* Сортировки выбором, слиянием и
* пирамидальная, быстрая на Си
* 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;
}
среда, 25 июня 2025 г.
Сортировки выбором, слиянием и пирамидальная, быстрая на Си
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий