算法基础--排序算法

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;
   }
}

思想

归并排序利用了分治法的思想,将一个大的问题变成几个相似的子问题

  1. 如何排序左边的数组
  2. 如何排序右边的数组
  3. 如何将左右排好序的数组联合起来

堆排序

代码

#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开始
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值