Professional Documents
Culture Documents
DSAmidterm
DSAmidterm
DSAmidterm
BinarySearch
bool binarysearch(int a[], int l, int r, int k){
while(l <= r){
int m = r - (r-l)/2;
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;
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
int i = l;
int j = 2*i;
while(j <= r){
if(j < r){
if(a[j+1] > a[j]) ++j; //Max heap
}
}
https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 3/27
11/16/23, 10:54 PM DSAmidterm - HackMD
a[r] = temp;
--r;
heapify(a,r,1);
}
}
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;
}
}
return j;
}
}
}
https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 4/27
MergeSort
11/16/23, 10:54 PM DSAmidterm - HackMD
struct Node {
int data;
struct Node* next;
};
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++];
}
}
}
Counting Sort
void countingsort(int a[], int l, int r,int f[]){
for(int i = l ; i <= r; ++i)
{
f[a[i]]++;
}
int b[r];
for(int i = r; i >= l ; --i)
{
b[f[a[i]]] = a[i];
f[a[i]]--;
}
https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 6/27
Radix Sort(Okn)
11/16/23, 10:54 PM DSAmidterm - HackMD
int index = 1;
for(int i = 0 ; i <= 9 ; ++i)
{
for(int j = 0 ; j < size[i] ; ++j)
{
a[index++] = L[j][i];
}
}
}
int b[n];
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
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];
}
}
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];
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;
}
struct SNode{
int val;
SNode* next;
};
struct DNode{
int val;
DNode* next;
DNode* prev;
};
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];
p = nullptr;
L[i].head = L[i].tail = nullptr;
}
}
}
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;
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
}
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(){
//bubbleSort(a,n);
//shakesort(a,n);
//intersectionsort(a,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 d = (int)log10(max_a) + 1;
// int d = (int)log2(max_a) + 1;
// msdradixsort(a, 1, n, d);
radix_sort_duallinkedlist(a, 1 , n, d);
https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 13/27
Other
11/16/23, 10:54 PM DSAmidterm - HackMD
struct st{
string num;
int index;
int L[r-l+1];
int R[r-l+1];
int p[r-l+1];
https://hackmd.io/KH_uOH3mR6G9YDTOmJ5gSQ?view 14/27