0% found this document useful (0 votes)
15 views14 pages

DSAmidterm

The document describes several sorting algorithms including: 1) Binary search for searching sorted arrays in logarithmic time 2) Bubble sort, which iterates through a list and swaps adjacent elements that are out of order 3) Merge sort, which divides a list recursively into single elements and then merges the sorted halves back together
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views14 pages

DSAmidterm

The document describes several sorting algorithms including: 1) Binary search for searching sorted arrays in logarithmic time 2) Bubble sort, which iterates through a list and swaps adjacent elements that are out of order 3) Merge sort, which divides a list recursively into single elements and then merges the sorted halves back together
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

11/16/23, 10:54 PM DSAmidterm - HackMD

BinarySearch
bool binarysearch(int a[], int l, int r, int k){
while(l <= r){
int m = r - (r-l)/2;

if(a[m] == k) return true;


else if(a[m] < k) l = m + 1;
else r = m - 1;
}
return false;
// Do phuc tap logn

Nội suy
bool interpolation(int a[], int l, int r, int k){
while(l <= r){
int x = int((k-a[l])*(r-l)/(a[r] - a[l])) + l;

if(a[x] == k) return true;


else if(a[x] < k) l = x + 1;
else r = x - 1;
}
return false;
}

Bubble Sort
void bubbleSort(int a[], int n)
{
for(int i = 0; i < n; ++i){
bool swapped = false;
for(int j = 0 ; j < n-i -1 ; ++j){
if(a[j] > a[j+1]){
swapped = true;
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
if(!swapped) break;
}
}

Privacy - Terms

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 1/27
ShakeSort
11/16/23, 10:54 PM DSAmidterm - HackMD

void shakesort(int a[], int n) // Cac so lon trong truong hop bubble sort => shak
{
int start = 0;
int end = n - 1;
while(end > start)
{
int tmp = start;
for(int i = start ; i < end ; ++i){
if(a[i] > a[i+1])
{
tmp = i + 1;
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
end = tmp;
for(int i = end ; i > start ; --i){
if(a[i] < a[i-1]){
tmp = i - 1;
int temp = a[i-1];
a[i-1] = a[i];
a[i] = temp;
}
}
start = tmp;
}
}

Intersection
void intersectionsort(int a[], int n){
for(int i = 0; i < n ; ++i){
int value = a[i];
int j = i - 1;
while(j >= 0 && a[j] > value){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
j--;
}
}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 2/27
HeapSort
11/16/23, 10:54 PM DSAmidterm - HackMD

void sift(int a[],int l,int r) //Create heap nlogn


{

int i = l;
int j = 2*i;
while(j <= r){
if(j < r){
if(a[j+1] > a[j]) ++j; //Max heap

if(a[i] < a[j]){ // Max heap


int temp = a[i];
a[i] = a[j];
a[j] = temp;
i = j;
j = 2*i;
}
else{
++i;
j = 2*i;
}

}
}

void heapify(int arr[], int N, int i) // On


{
int largest = i; // Initialize largest as root
int l = 2 * i ; // left = 2*i + 1
int r = 2 * i +1; // right = 2*i + 2

// If left child is larger than root


if (l < N && arr[l] > arr[largest])
largest = l;

// If right child is larger than largest so far


if (r < N && arr[r] > arr[largest])
largest = r;

// If largest is not root


if (largest != i) {
swap(arr[i], arr[largest]);

// Recursively heapify the affected sub-tree


heapify(arr, N, largest);
}
}

// Function to build a Max-Heap from the given array


void buildHeap(int arr[], int N)
{
// Index of last non-leaf node
int startIdx = (N / 2);

// Perform reverse level order traversal


// from last non-leaf node and heapify
// each node
for (int i = startIdx; i >= 1; i--) {
heapify(arr, N, i);
}
}

void heapSort2(int a[], int l, int r){


for(int i = 1 ; i <= r; ++i){
cout << a[i] << " ";
}
cout << endl;
int i = l;
while(i <= r){
int temp = a[i];
a[i] = a[r];

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 3/27
11/16/23, 10:54 PM DSAmidterm - HackMD
a[r] = temp;
--r;
heapify(a,r,1);
}
}

void heapSort(int a[], int l, int r){


int i = l;
while(i <= r){
int temp = a[i];
a[i] = a[r];
a[r] = temp;
--r;
sift(a,1,r);
}
}

QuickSort
int partition(int a[], int l, int r)
{
int pivot = a[l];
int i = l;
int j = r+1;

while(i < j)
{
++i;
while(a[i] < pivot) ++i;
--j;
while(a[j] > pivot) --j;

if(i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}

int temp = a[l];


a[l] = a[j];
a[j] = temp;

return j;
}

void qsort(int a[], int l ,int r)


{
if(l < r)
{
int p = partition(a,l,r);
qsort(a,l,p-1);
// for(int i = 1 ; i <= r ; ++i)
// {
// cout << a[i] << " ";
// }
// cout << endl;
qsort(a,p+1,r);

}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 4/27
MergeSort
11/16/23, 10:54 PM DSAmidterm - HackMD

struct Node {
int data;
struct Node* next;
};

void splitList(Node* head, Node** a, Node** b) {


Node* slow = head;
Node* fast = head->next;
while (fast != NULL) {
fast = fast->next;
if (fast != NULL) {
slow = slow->next;
fast = fast->next;
}
}
*a = head;
*b = slow->next;
slow->next = NULL;
}

Node* mergeLists(Node* a, Node* b) {


Node* result = NULL;
if (a == NULL)
return b;
else if (b == NULL)
return a;
if (a->data <= b->data) {
result = a;
result->next = mergeLists(a->next, b);
}
else {
result = b;
result->next = mergeLists(a, b->next);
}
return result;
}

void mergeSort(Node** headRef) {


Node* head = *headRef;
Node* a;
Node* b;
if ((head == NULL) || (head->next == NULL)) {
return;
}
splitList(head, &a, &b);
mergeSort(&a);
mergeSort(&b);
*headRef = mergeLists(a, b);
}

void push(Node** headRef, int newData) {


Node* newNode = new Node();
newNode->data = newData;
newNode->next = (*headRef);
(*headRef) = newNode;
}

void printList(Node *node) {


while (node!=NULL) {
cout<<node->data<<" ";
node = node->next;
}
}
void merge(int a[], int l, int m, int r) // merge start 1
{
int b[r];
int c[r];
int len_b = m - l + 1;
int len_c = r-m;
//cout << len_b << "-" << len_c << "|" << l<< endl;
for(int i = 1 ; i <=len_b; ++i)
{
b[i] = a[l+i-1];
}
for(int i = 1; i <= len_c; ++i)

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 5/27
11/16/23, 10:54 PM DSAmidterm - HackMD
{
c[i] = a[i + m];
}
int i = 1, j = 1;
int index = l;
while(i < len_b + 1 && j < len_c + 1)
{
if(b[i] >= c[j])
{
a[index++] = c[j++];
}
else
{
a[index++] = b[i++];

}
}
while(i < len_b + 1)
{
a[index++] = b[i++];
}

while(j < len_c + 1)


{
a[index++] = c[j++];
}

void mergeSort(int a[], int l, int r)


{
if(l < r)
{
int m = (r+l)/2;
mergeSort(a,l,m);
mergeSort(a,m+1,r);
merge(a,l,m,r);

}
}

Counting Sort
void countingsort(int a[], int l, int r,int f[]){
for(int i = l ; i <= r; ++i)
{
f[a[i]]++;
}

for(int i = 1 ; i <= 100; ++i)


{
f[i] += f[i-1];
}
for(int i = 1 ; i <= 100; ++i)
{
if(f[i] != 0)
{
cout << i << "-" << f[i] << endl;
}
}

int b[r];
for(int i = r; i >= l ; --i)
{
b[f[a[i]]] = a[i];
f[a[i]]--;
}

for(int i = l ; i <= r; ++i){


a[i] = b[i];
}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 6/27
Radix Sort(Okn)
11/16/23, 10:54 PM DSAmidterm - HackMD

int digit(int num, int k)


{
for(int i = 1 ; i < k ; ++i)
{
num /= 10;
}
return num%10;
}

void radix_sort(int a[], int k,int L[100][100],int size[],int n)


{
for(int i = 0 ; i <= 9 ; ++i)
{
size[i] = 0;
}

for(int i = 1 ; i <= n; ++i)


{
int dig = digit(a[i], k);
L[size[dig]][dig] = a[i];
size[dig]++;
}

int index = 1;
for(int i = 0 ; i <= 9 ; ++i)
{
for(int j = 0 ; j < size[i] ; ++j)
{
a[index++] = L[j][i];
}
}
}

void radix_sort2(int a[], int n, int k)


{
int f[10]; // f[2] binary
for(int i = 0 ; i <= 9 ; ++i) f[i] = 0;

for(int i = 1 ; i <= n; ++i)


{
int dig = digit(a[i], k); // dig = (a[i] >> k) & 1
f[dig]++;
}

for(int i = 1 ; i <= 9 ; ++i)


{
f[i] += f[i-1];
}

int b[n];

for(int i = n; i >= 1; --i)


{
int dig = digit(a[i], k); // dig = (a[i] >> k) & 1
b[f[dig]] = a[i];
f[dig]--;
}

for(int i = 1 ; i <= n ; ++i)


{
a[i] = b[i];
}
}
void radix_sort(vector<int>& nums,bool ascending = true, bool neg = false)
{

if(neg)
{
for(int i = 0 ; i < nums.size() ; ++i) nums[i] = -nums[i];
ascending = !ascending;

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 7/27
11/16/23, 10:54 PM DSAmidterm - HackMD

int max_nums = nums[0];


for(int i = 1 ; i < nums.size() ; ++i)
{
if(max_nums < nums[i]) max_nums = nums[i];
}
if(max_nums == 0) return;
int d = (int)log10(max_nums) + 1;
for(int k = 1 ; k <= d ; ++k)
{
int* f = new int[10];
for(int i = 0 ; i <= 9 ; ++i) f[i] = 0;

for(int i = 0 ; i < nums.size(); ++i)


{
int dig = digit(nums[i],k);
f[dig]++;
}
for(int i = 1 ; i <= 9 ; ++i) f[i] += f[i-1];

int* b = new int[nums.size()];


for(int i = nums.size()-1 ; i >= 0; --i)
{
int dig = digit(nums[i],k);
b[f[dig]-1] = nums[i];
f[dig]--;
}
for(int i = 0 ; i < nums.size(); ++i) nums[i] = b[i];
delete[] b;
delete[] f;
}

if(ascending == false)
{
for(int i = 0 ; i < nums.size()/2 ; ++i)
{
int temp = nums[i];
nums[i] = nums[nums.size() - i - 1];
nums[nums.size() - i - 1] = temp;
}
}
if(neg)
{
for(int i = 0 ; i < nums.size() ; ++i) nums[i] = -nums[i];
}
}

void radix_sort_neg(vector<int>& nums)


{
vector<int> nega;
vector<int> pos;

int n = nums.size();
for(int i = 0 ; i < n; ++i)
{
if(nums[i] < 0 ) nega.push_back(nums[i]);
else pos.push_back(nums[i]);
}

radix_sort(pos);
radix_sort(nega, true, true);
for(int i = 0 ; i < nega.size(); ++i) nums[i] = nega[i];
for(int i = 0 ; i < pos.size(); ++i) nums[i + nega.size()] = pos[i];

int getbit(int val, int pos) {


return (val >> pos) & 1;
}

void swap(int& x, int& y) {


int tmp = x;
x = y;
y = tmp;
return;
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 8/27
11/16/23, 10:54 PM DSAmidterm - HackMD
void msdradixsort(int a[], int l,int r, int k){
// if (l >= r || k < 0) return;
// int t = l, p = r;
// while (t < p) {
// while(t <= r && getbit(a[t], k) == 0) ++t;
// while(p >= l && getbit(a[p], k) == 1) --p;
// cout << t << ' ' << p << '\n';
// if(t > p) break;
// swap(a[t], a[p]);
// ++t;
// --p;
// cout << "! " << t << ' ' << p << '\n';
// }

// cout << l << ' ' << r << ' ' << k << ' ' << t << ' ' << p << '\n';
// msdradixsort(a, l, t - 1 , k - 1);
// msdradixsort(a, t, r, k - 1);
// return;

//
if(l < r && k >= 0)
{
int left = l;
int right = r;
while (left <= right) {
while((left <= r && !((a[left] >> k) & 1))) ++left;
while((right >= l) && (((a[right] >> k) & 1))) --right;
if(left >= right) break;
int temp = a[left];
a[left] = a[right];
a[right] = temp;
}

msdradixsort(a, l, left -1,k-1);


msdradixsort(a, left,r,k-1);
}
}

struct SNode{
int val;
SNode* next;
};

struct DNode{
int val;
DNode* next;
DNode* prev;
};

SNode* createSNode(int value)


{
SNode* a = new SNode;
a->val = value;
a->next = nullptr;
return a;
}

DNode* createDNode(int value)


{
DNode* a = new DNode;
a->val = value;
a->next = nullptr;
a->prev = nullptr;
return a;
}

struct Ref_single{
SNode* head;
SNode* tail;
void addTail(int val)
{
SNode* p = createSNode(val);

if(head == nullptr)
{
head= tail = p;
return;

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 9/27
11/16/23, 10:54 PM DSAmidterm - HackMD

}
tail->next = p;
tail = p;
}

void init()
{
head = nullptr;
tail = nullptr;
}
};

struct Ref_dual{
DNode* head;
DNode* tail;
void addTail(int val)
{
DNode* p = createDNode(val);

if(head == nullptr)
{
head= tail = p;
return;

}
DNode* tmp = tail;
tail->next = p;
tail = p;
tail->prev = tmp;
}

void init()
{
head = nullptr;
tail = nullptr;
}
};
Ref_single L[10];
Ref_dual D[10];

void radix_sort_linkedlist(int a[], int l, int r, int d)


{
for(int i = 0 ; i <= 9 ; ++i) L[i].init();

for(int k = 1 ; k <= d; ++k)


{
for(int i = l ; i <= r; ++i)
{
int dig = digit(a[i], k);
L[dig].addTail(a[i]);
}
int index = 1;
for(int i = 0 ; i <= 9 ; ++i)
{
SNode* p = L[i].head;
while(p != nullptr)
{
a[index++] = p->val;

SNode* tmp = p->next;


delete p;
p = tmp;
}

p = nullptr;
L[i].head = L[i].tail = nullptr;

}
}
}

void radix_sort_duallinkedlist(int a[], int l, int r, int d)


{
for(int i = 0 ; i <= 9 ; ++i) L[i].init();

for(int k = 1 ; k <= d; ++k)

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 10/27
11/16/23, 10:54 PM DSAmidterm - HackMD
{
for(int i = l ; i <= r; ++i)
{
int dig = digit(a[i], k);
L[dig].addTail(a[i]);
}
int index = 1;
for(int i = 0 ; i <= 9 ; ++i)
{
SNode* p = L[i].head;
while(p != nullptr)
{
a[index++] = p->val;

SNode* tmp = p->next;


delete p;
p = tmp;
}

p = nullptr;
L[i].head = L[i].tail = nullptr;

}
}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 11/27
FlashSort O(n)
11/16/23, 10:54 PM DSAmidterm - HackMD

void flashsort(int a[], int l, int r)


{

//Giai doan 1 : Xac dinh phan lop


int m = (int)(0.45*(r-l+1)); // so phan lop
int L[m]; // L[i] luu vi tri bien phai cua phan lop thu i

for(int i = 1 ; i <= m ; ++i) L[i] = 0;


int min_a = a[l],max_a = a[l];

for(int i = l ; i <= r; ++i)


{
if(min_a > a[i]) min_a = a[i];
if(max_a < a[i]) max_a = a[i];
}
for(int i = l ; i <= r; ++i)
{
int k = (int)((m-1)*(a[i] - min_a)/(max_a - min_a)) + 1;
L[k]++; // So phan tu cua phan lop thu k tang len 1
}

for(int k = 2 ; k <= m ; ++k) L[k] += L[k-1]; // L[i] la bien ben phai cu

//Giai doan 2 : Phan hoach phan lop

//i <= L[kai] thi chua phan hoach


int i = l, k = m, count = l;
while(count <= r)
{

while(i > L[k])


{
++i;
k = (int)((m-1)*(a[i] - min_a)/(max_a - min_a)) + 1;

}
int x = a[i];
while(i <= L[k])
{
k = (int)((m-1)*(a[i] - min_a)/(max_a - min_a)) + 1;
int y = a[L[k]];
a[L[k]] = x;
x = y;
L[k]--;
++count;
}
}
//Giai doan 3 : Insertion sort sort cac phan tu trong bucket
// L[i+1] bieu dieu vi tri bien ben phai cua phan lop thu i
for(int k = 2 ; k <= m; ++k)
{
for(int i = L[k] - 1 ; i > L[k-1] ; --i)
{
if(a[i] > a[i+1])
{
int t = a[i];
int j = i;
while(j > L[k-1] && t > a[j+1])
{
a[j] = a[j+1];
++j;
}
a[j] = t;
}
}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 12/27
11/16/23, 10:54 PM DSAmidterm - HackMD

int main(){

int n; cin >> n;


int a[n + 1];

for(int i = 1 ; i <= n; ++i) cin >> a[i];


int k,l,r;
cin >> k >> l >> r;
// cout << binarysearch(a,l,r,k) << endl;
// cout << interpolation(a,l,r,k) << endl;

//bubbleSort(a,n);
//shakesort(a,n);
//intersectionsort(a,n);

// for(int i = 1 ; i <= n ; ++i)


// {
// sift(a,1,n);
// }
// heapSort(a,1,n);

// buildHeap(a,n);
// heapSort2(a,1,n);

//qsort(a,1,n);

// mergeSort(a,1,n);

// int f[100];
// for(int i = 0 ; i <= 100; ++i)
// {
// f[i] = 0;
// }
// countingsort(a,1,n,f);

// int size[10];
// int L[100][100];

int max_a = a[1];


for(int i = 2; i <= n; ++i)
{
if(max_a < a[i])
{
max_a = a[i];
}
}

int d = (int)log10(max_a) + 1;

// for(int k = 1 ; k <= d ; ++k)


// {
// radix_sort(a, k, L,size,n);
// }

// for(int k = 1 ; k <= d ; ++k)


// {
// radix_sort2(a, n,k);
// }

// int d = (int)log2(max_a) + 1;

// msdradixsort(a, 1, n, d);

radix_sort_duallinkedlist(a, 1 , n, d);

for(int i = 1 ; i <= n; ++i){


cout << a[i] << " ";
}
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 13/27
Other
11/16/23, 10:54 PM DSAmidterm - HackMD

struct st{
string num;
int index;

bool operator < (const st & other) const {


return ((num < other.num) || (num == other.num && index < other.index));
}
};

int findkth(int a[] ,int l, int r, int k)


{
if(l >= r) return a[l];
int ans = a[l];

int L[r-l+1];
int R[r-l+1];
int p[r-l+1];

int len_l = 0, len_r = 0, len_p = 0;


int pivot = a[l];
for(int i = l ; i < r ; ++i)
{
if(a[i] < pivot)
{
L[len_l++] = a[i];
}
else if(a[i] == pivot)
{
p[len_p++] = a[i];
}
else
{
R[len_r++] = a[i];
}
}

if(k <= len_l) ans =findkth(L,0,len_l,k);


else if(k <= len_l + len_p) ans = pivot;
else ans = findkth(R,0,len_r, r - k );
return ans;
}

https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 14/27

You might also like