面试笔试排序算法
1 // 冒泡排序 2 // 2个相邻的元素相互比较,不满足顺序则交换;每遍历一次数组,使一个元素处于最终位置。 3 void BubbleSort(std::vector<int>& nums) 4 { 5 if(nums.empty()) 6 { 7 return; 8 } 9 10 bool sorted = false; // 假设没有排好序 11 size_t n = nums.size(); 12 13 while(!sorted) 14 { 15 sorted = true; // 假设已经排好序 16 for(int i = 1; i < n; ++i) 17 { 18 if(nums[i-1] > nums[i]) 19 { 20 std::swap(nums[i-1], nums[i]); 21 sorted = false; // 恢复为已排好序 22 } 23 } 24 --n; // 已经排好序的元素不必再参与排序了 25 } 26 } 27 46 // 快速排序 47 // 随机在数组中选择一个元素,作为划分元素,将数组中比划分元素小的交换到左侧, 48 // 比划分元素大的交换到右侧,最后将划分元素交换到左右区间的连接处,则划分元素处于了最终位置; 49 // 递归地对左右区间进行快速排序。 50 int Partition(vector<int>& vec, int low, int up) 51 { 52 int pivot = vec[up]; 53 int i = low - 1; 54 55 for(int j = low; j < up; ++j) 56 { 57 if(vec[j] <= pivot) 58 { 59 ++i; 60 std::swap(vec[i], vec[j]); 61 } 62 } 63 std::swap(vec[i+1], vec[up]); 64 65 return i+1; 66 } 67 68 void QuickSort(vector<int>& vec, int low, int up) 69 { 70 if(low < up) 71 { 72 int mid = Partition(vec, low, up); 73 74 QuickSort(vec, low, mid - 1); 75 QuickSort(vec, mid + 1, up); 76 } 77 }
1 /* 2 插入排序 3 */ 4 void InsertionSort(std::vector<int>& vec) 5 { 6 int num = vec.size(); 7 8 for (int i = 1; i < num; ++i) 9 { 10 for (int j = i; j > 0 && vec[j] < vec[j - 1]; --j) 11 { 12 std::swap(vec[j], vec[j - 1]); 13 } 14 } 15 }
1 /* 2 归并排序 3 */ 4 5 class MergeSort 6 { 7 public: 8 void merge(std::vector<int>& vec, int low, int mid, int high) 9 { 10 int i = low; int j = mid + 1; 11 12 for (int k = low; k <= high; ++k) 13 { 14 aux_[k] = vec[k]; 15 } 16 17 for (int k = low; k <= high; ++k) 18 { 19 if (i > mid) 20 { 21 vec[k] = aux_[j++]; 22 } 23 else if (j > high) 24 { 25 vec[k] = aux_[i++]; 26 } 27 else if (aux_[j] < aux_[i]) 28 { 29 vec[k] = aux_[j++]; 30 } 31 else 32 { 33 vec[k] = aux_[i++]; 34 } 35 } 36 } 37 38 void merge_sort(std::vector<int>& vec, int low, int high) 39 { 40 if (low >= high) 41 { 42 return; 43 } 44 45 int mid = low + (high - low) / 2; 46 47 merge_sort(vec, low, mid); 48 merge_sort(vec, mid + 1, high); 49 merge(vec, low, mid, high); 50 } 51 52 void sort(std::vector<int>& vec, int low, int high) 53 { 54 aux_.resize(vec.size()); 55 merge_sort(vec, 0, vec.size() - 1); 56 } 57 58 private: 59 static std::vector<int> aux_; 60 }; 61 62 std::vector<int> MergeSort::aux_;
/* 选择排序 */ void SelectionSort(std::vector<int>& vec) { int num = vec.size(); // 向量大小 for (int i = 0; i < num; ++i) // 外循环 从下标0开始 { int min = i; // 最小元素的下标 for (int j = i + 1; j < num; ++j) // 从i的下一个元素开始 { if (vec[j] < vec[min]) { min = j; } } std::swap(vec[i], vec[min]); } }