最近爲了準備面試,看到許多帖子說考這考那的,我總了一些出現頻率比較高的算法。
希望能幫到大家,當然也爲以後複習做準備,免得再次找來找去的,另外大家也可多提提意見,我再梳理梳理。
一、常見排序算法:
1、快速排序:例如,若對100個數排序,則 QuickSort(array,0,99),另外爲了整體美觀,swap 函數就不寫,相信大家都會。
void QuickSort(int num[], int start,int end){ if(start >= end){ return; } int base = num[start]; int i = start; int j = start + 1; while(j <= end){ if(num[j] < base){ i++; swap(num,i,j); } j++; } swap(num,start,i); QuickSort(num,start,i-1); QuickSort(num,i+1,end); }
2、歸併排序:例如,若對100個數排序,則 QuickSort(array,0,99);
void Merge(int num[],int start, int middle, int end){ int ln = middle - start + 1; int rn = end - middle; int *left_num = new int[ln]; //記得釋放內存,避免內存泄漏 int *right_num = new int[rn]; //記得釋放內存,避免內存泄漏 for(int i = 0; i < ln; i++){ left_num[i] = num[start+i]; } for(int j = 0; j < rn; j++){ right_num[j] = num[middle+j+1]; } int i = 0,j = 0,k = start; while(i < ln && j < rn){ if(left_num[i] <= right_num[j]){ num[k++] = left_num[i++]; }else{ num[k++] = right_num[j++]; } } while(i < ln){ num[k++] = left_num[i++]; } while(j < rn){ num[k++] = right_num[j++]; } delete[] left_num; delete[] right_num; } void MergeSort(int num[],int start, int end){ if(start >= end){ return; } int middle = (start + end) / 2; MergeSort(num,start,middle); // 拆分 MergeSort(num,middle+1,end); // 拆分 Merge(num,start,middle,end); // 歸併 }
3、堆排序(升序):例如,若對100個數排序,則 HeapSort(array,100); swap 函數同樣省略。
void HeapAdjust(int num[], int i, int length){ for(int j = 2*i + 1; j < length; j = 2*j + 1){ if(j + 1 < length && num[j] < num [j+1]){ j++; } if(num[j] > num[i]){ swap(num,i,j); i = j; } } } void HeapSort(int num[], int length){ for(int i = length / 2 - 1; i >= 0; i--){ // 構建初始堆 HeapAdjust(num,i,length); } for(int i = length - 1; i > 0; i--){ swap(num,0,i); // 利用堆頂性質,交換堆頂與末尾元素 HeapAdjust(num,0,i); } }
二、二叉樹常用算法:膜拜一下 大佬
三、單鏈表常用算法:再膜拜一下 大佬