mind and hand
插入排序
代码
void InsertSort(vector<int>& a) {
int length = a.size();
for(int i = 1; i < length; i++) {
int key = a[i];
int j = i-1;
while (j >= 0 && key < a[j]) {
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
思想
值得注意的点:
- 算法是从数组后往前找,在找的过程中将数组实现了后移,当找到符合条件的位置时,只需要直接赋值即可
归并排序
代码
void Merge(vector<int>& a, int p, int q, int r) {
vector<int> result;
int i = p, j = q+1;
while(i <= q && j <= r) {
if(a[i] <= a[j]) {
result.push_back(a[i]);
i++;
}
else {
result.push_back(a[j]);
j++;
}
}
while(i <= q) {
result.push_back(a[i]);
i++;
}
while(j <= r) {
result.push_back(a[j]);
j++;
}
for(int i = p, j = 0; i <= r; i++) {
a[i] = result[j++];
}
}
void Merge_Sort(vector<int>& nums, int left,int right) {
if(left==right) return;
int mid = (right-left)/2+left;
Merge_Sort(nums, left, mid);
Merge_Sort(nums, mid+1, right);
Merge(nums, left, mid, right);
}
int main() {
int length;
cout << "please input array length\n";
cin >> length;
vector<int> test(length, 0);
cout << "please input the array\n";
for (int i = 0; i < length; i++) {
cin >> test[i];
}
Merge_Sort(test, 0, length-1);
for (int i = 0; i < length; i++) {
std::cout << test[i] << std::endl;
}
}
思想
归并排序利用了分治法的思想,将一个大的问题变成几个相似的子问题
- 如何排序左边的数组
- 如何排序右边的数组
- 如何将左右排好序的数组联合起来
堆排序
代码
#define PARENT(i) (((i+1) >> 1) - 1)
#define LEFT(i) (((i+1) << 1)-1)
#define RIGHT(i) ((i+1) << 1)
void max_heapify(vector<int>& nums, int i) {
int l = LEFT(i);
int r = RIGHT(i);
int large = i;
if(l <= nums.size() && nums[l] > nums[i]) {
large = l;
}
if(r <= nums.size() && nums[r] > nums[i] && nums[r] > nums[l]) {
large = r;
}
if(large != i) {
int tmp = nums[i];
nums[i] = nums[large];
nums[large] = tmp;
max_heapify(nums, large);
}
}
void build_max_heap(vector<int>& nums) {
for(int i = PARENT(nums.size()-1); i >= 0; i--) {
max_heapify(nums, i);
}
}
vector<int> heap_sort(vector<int>& nums) {
vector<int> result;
while(nums.size() >= 2) {
build_max_heap(nums);
result.insert(result.begin(), nums[0]);
nums[0] = nums[nums.size()-1];
nums.pop_back();
}
result.insert(result.begin(), nums[0]);
return result;
}
//=====================测试函数=========================
int main() {
int length;
vector<int> result;
cout << "please input array length\n";
cin >> length;
vector<int> test(length, 0);
cout << "please input the array\n";
for (int i = 0; i < length; i++) {
cin >> test[i];
}
result = heap_sort(test);
std::cout << "result is:" << std::endl;
for (int i = 0; i < length; i++) {
std::cout << result[i] << std::endl;
}
}
注意
- 当堆的根节点从1开始时, p a r e n t = ⌊ n 2 ⌋ parent = \left \lfloor \frac{n}{2} \right \rfloor parent=⌊2n⌋, l e f t = 2 n left = 2n left=2n, r i g h t = 2 n + 1 right = 2n+1 right=2n+1,但是编写时数组从 0 0 0开始