2 분 소요

merge sort

 
void merge_sort(int l, int r){  if (r - l < 1) return;  int half = (l + r) / 2, idx = l, li = l, ri = half + 1;  merge_sort(l, half);  merge_sort(half + 1, r);  while (li <= half && ri <= r){   if (W[li].e < W[ri].e) m_b[idx++] = li++;   else m_b[idx++] = ri++;  }  while (li <= half) m_b[idx++] = li++;  while (ri <= r) m_b[idx++] = ri++;

binary search

 
void binary_search(int low, int high, int target) {  int mid;  if (low > high)  {   return;  }  mid = (low + high) / 2;  if (target < buff_sort[mid].t)  {   binary_search(low, mid - 1, target);  }  else if (buff_sort[mid].t < target)  {   binary_search(mid + 1, high, target);  }  else  {   cc = mid;   return;  } }

linked list

 
struct Node{  int to, cost;  Node *next; }; int nidx; Node nodes[1000001];

linked list 문제 (disk scheduling)

 
#define DIV 100 #define LEFTMIN -200000 #define RIGHTMAX 300000 typedef struct Node{  int data;  int next; }; int Head[100000 / DIV + 5]; Node List[100005]; int queue[100005], front, rear; int N, H, M; bool flag[100005]; bool dir; void add(int val){  List[M].data = val;  List[M].next = Head[val / DIV];  Head[val / DIV] = M++; } void remove_list(int val) {  int prev = 0;  int cur = Head[val / DIV];  while (cur){   if (List[cur].data == val){    if (prev == 0){     Head[val / DIV] = List[cur].next;    }    else{     List[prev].next = List[cur].next;    }    break;   }   prev = cur;   cur = List[cur].next;  } } int findLeft(int val){  int max = LEFTMIN;  for (int i = val / DIV; i >= 0 && max == LEFTMIN; –i){   int cur = Head[i];   while (cur){    if (List[cur].data <= val){     if (max < List[cur].data){      max = List[cur].data;     }    }    cur = List[cur].next;   }  }  return max; } int findRight(int val){  int min = RIGHTMAX;  for (int i = val / DIV; i <= N / DIV && min == RIGHTMAX; ++i){   int cur = Head[i];   while (cur){    if (List[cur].data >= val){     if (min > List[cur].data){      min = List[cur].data;     }    }    cur = List[cur].next;   }  }  return min; } int init(int track_size, int head){  N = track_size;  H = head;  M = 1;  dir = false;  front = rear = 0;  for (int i = 0; i < (100000 / DIV + 5); ++i){   Head[i] = 0;  }  for (int i = 0; i <= track_size; ++i){   flag[i] = false;  } } void request(int track){  queue[rear++] = track;  add(track); } int fcfs(){  int qValue;  while (front < rear){   qValue = queue[front++];   if (!flag[qValue]){    break;   }  }  flag[qValue] = true;  remove_list(qValue);  return H = qValue; } int sstf(){  int left = findLeft(H);  int right = findRight(H);  if (H - left <= right - H){   H = left;  }  else{   H = right;  }  flag[H] = true;  remove_list(H);  return H; } int look(){  int left = findLeft(H);  int right = findRight(H);  if (!dir){   if (left == LEFTMIN){    dir = true;    H = right;   }   else H = left;  }  else{   if (right == RIGHTMAX){    dir = false;    H = left;   }   else H = right;  }  flag[H] = true;  remove_list(H);  return H; } int clook(){  int left = findLeft(H);  if (left == LEFTMIN){   left = findLeft(N);  }  H = left;  flag[H] = true;  remove_list(H);  return H; }