Sunteți pe pagina 1din 12

Disciplina: Structuri de date și algoritmi

Lucrare de Laborator Nr.2

Tema: Sortarea

A efectuat student: ____________

A controlat:______________(lect.univ. M.Guțu)

Chișinău 2021
F. Equalize the Array

#include <stdio.h>
#include <stdlib.h>
void afisare(int a[],int n)
{
for (int i=0; i<n; i++){
printf("%d ",a[i]);
}
printf("\n");
}
int shellsort(int a[], int n)
{
for (int gap=n/2; gap>0; gap/=2)
{
for (int i=gap; i<n; i+=1){

int temp=a[i];
int j;
for (j=i; j>=gap && a[j-gap] > temp; j-=gap)
a[j]=a[j-gap];
a[j]=temp;
}
}
return 0;
}
2
int main()
{
int a[]={1, 3, 2, 1, 4, 2},poz1,poz2;
int n=sizeof(a)/sizeof(a[0]);
afisare(a,n);
printf("Scrieti pozitia care doriti sa o eliminati \n");
scanf("%d %d",&poz1,&poz2);
if (poz1>= n+1 && poz2>=n+1)
printf("Eliminarea nu e posibila \n");
else
{
for (int i=poz1; i<n-1; i++)
a[i]=a[i+1];
for (int i=poz2; i<n-2; i++)
a[i]=a[i+1];
printf("Arrayul rezultant: \n");
for (int i=0; i<n-1; i++)
printf("%d ",a[i]);
}
shellsort(a,n);
printf("\nArrayul dupa sortare \n");
afisare(a,n);
return 0;
}

Shell sort
3
#include <stdio.h>
#include <stdlib.h>

int shellsort(int arr[], int n)


{
for (int gap=n/2; gap>0; gap/=2)
{
for (int i=gap; i<n; i+=1){

int temp=arr[i];
int j;
for (j=i; j>=gap && arr[j-gap] > temp; j-=gap)
arr[j]=arr[j-gap];
arr[j]=temp;
}
}
return 0;
}
void afisare(int arr[],int n)
{
for (int i=0; i<n; i++){
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
4
{
int arr[]={3, 1, 55, 32, 13},i;
int n=sizeof(arr)/sizeof(arr[0]);
printf("Arrayul inainte sortare:\n");
afisare(arr,n);
shellsort(arr,n);
printf("\nArrayul dupa sortare:\n");
afisare(arr,n);
return 0;
}
Se dă un şir cu n numere întregi. Să se ordoneze numerele din sirul dat utilizand
sortarea quicksort.
void afisare(int a[],int n)
{
for (int i=0; i<n; i++){
printf("%d ",a[i]);
}
printf("\n");
}
void schimbare(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (int arr[], int low, int high)

5
{
int pivot = arr[high];
int i = (low - 1);

for (int j = low; j <= high - 1; j++)


{
if (arr[j] < pivot)
{
i++;
schimbare(&arr[i], &arr[j]);
}
}
schimbare(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main()
{
6
int a[] = {10, 7, 8, 9, 1, 5,44,21,47,87,2,6};
int n = sizeof(a) / sizeof(a[0]);
quickSort(a, 0, n - 1);
printf("Arrayul sortat: \n");
afisare(a, n);
return 0;
}
Se dă un şir cu n numere întregi. Să se ordoneze crescător numerele pare utilizand
sortarea quicksort.
void schimbare(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (int arr[], int low, int high)
{
int pivot = arr[high];
int i = (low - 1);

for (int j = low; j <= high - 1; j++)


{
if (arr[j] < pivot)
{
i++;
schimbare(&arr[i], &arr[j]);

7
}
}
schimbare(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main(){
int a[] = {10, 7, 8, 9, 1, 5,44,21,47,87,2,6,12};
int n = sizeof(a) / sizeof(a[0]);
for (int i=0; i<n; i++){
printf("%d ",a[i]);

}
quickSort(a, 0, n - 1);
printf("\nArrayul sortat par:");
for (int i = 1; i <= n; i++)
if (a[i] % 2 == 0)
printf("%d ",a[i]);
8
return 0;}
Se dă un şir cu n numere întregi. Să se ordoneze numerele din sirul dat utilizand
sortarea heapsort.
void schimbare(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}

void heapify(int arr[], int n, int i) {


int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;

if (left < n && arr[left] > arr[largest])


largest = left;

if (right < n && arr[right] > arr[largest])


largest = right;
if (largest != i) {
schimbare(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}

9
void heapSort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for (int i = n - 1; i >= 0; i--) {
schimbare(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}

void printArray(int arr[], int n) {


for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {1, 12, 9, 5, 6, 10,21,25,2,13};
int n = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, n);
printf("Arrayul sortat este \n");
printArray(arr, n);
}
Se dă un şir cu n numere întregi. Să se ordoneze crescător numerele impare
utilizand sortarea HeapSort.
void swap(int *a, int *b) {
int temp = *a;
*a = *b;

10
*b = temp;
}

void heapify(int arr[], int n, int i) {


int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;

if (left < n && arr[left] > arr[largest])


largest = left;

if (right < n && arr[right] > arr[largest])


largest = right;
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}

void heapSort(int arr[], int n) {


for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for (int i = n - 1; i >= 0; i--) {
swap(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
11
}

void printArray(int arr[], int n) {


for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {1, 12, 9, 5, 6, 10,21,25,2,13};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Arrayul initial: ");
printArray(arr,n);
heapSort(arr, n);
printf("\nArrayul sortat impar este \n");
for (int i = 1; i <= n; i++)
if (arr[i] % 2 == 1)
printf("%d ",arr[i]);
return 0;
}

12

S-ar putea să vă placă și