面试笔试排序算法
1 // 冒泡排序
2 // 2個(gè)相鄰的元素相互比較,不滿足順序則交換;每遍歷一次數(shù)組,使一個(gè)元素處于最終位置。
3 void BubbleSort(std::vector<int>& nums)
4 {
5 if(nums.empty())
6 {
7 return;
8 }
9
10 bool sorted = false; // 假設(shè)沒(méi)有排好序
11 size_t n = nums.size();
12
13 while(!sorted)
14 {
15 sorted = true; // 假設(shè)已經(jīng)排好序
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; // 恢復(fù)為已排好序
22 }
23 }
24 --n; // 已經(jīng)排好序的元素不必再參與排序了
25 }
26 }
27
46 // 快速排序
47 // 隨機(jī)在數(shù)組中選擇一個(gè)元素,作為劃分元素,將數(shù)組中比劃分元素小的交換到左側(cè),
48 // 比劃分元素大的交換到右側(cè),最后將劃分元素交換到左右區(qū)間的連接處,則劃分元素處于了最終位置;
49 // 遞歸地對(duì)左右區(qū)間進(jìn)行快速排序。
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) // 外循環(huán) 從下標(biāo)0開(kāi)始 {int min = i; // 最小元素的下標(biāo)for (int j = i + 1; j < num; ++j) // 從i的下一個(gè)元素開(kāi)始 {if (vec[j] < vec[min]){min = j;}}std::swap(vec[i], vec[min]);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/lijiatu/p/5892332.html
總結(jié)
- 上一篇: 只出现一次的数字3
- 下一篇: css 用direction来改变元素水