插入排序和冒泡排序,之前一直特容易混淆。。。。。
插入排序:想起小时候的桥牌,即每摸一张牌,就要将牌插入到已经排好序的序列中。假设输入是数组nums,要将数组升序排列,依次从头至尾对数组执行如下操作:
比较当前元素nums[i]与nums0~numsi-1;若num[i] 大于其中某一个元素j (j的范围0~i-1),先将j~(i-1)位置上的元素依次后移,然后将nums[i]插入至j位置。
对于插入和冒泡,插入排序是元素与已经排好序的序列比较,冒泡是相邻元素依次比较并调换顺序。囧~~~~~。
插入排序代码如下:
#include <stdio.h>
#include <vector>
#include <stdio.h>
using namespace std;
class Solution {
public:
// 从位置front_index 至last_index之间元素依次后移
// last_index就是当前比较的元素的位置
void moveElements(vector<int>& nums, int front_index, int last_index)
{
if (last_index <= front_index || front_index < 0 || last_index >= nums.size())
{
return ;
}
for (int j = last_index - 1; j >= front_index; j--)
{
nums[j + 1] = nums[j];
}
}
vector<int> sortArray(vector<int>& nums) {
for (int i = 1; i < nums.size(); i++) {
for (int j = 0; j < i; j++)
{
//依次拿i前面的有序序列和nums[i]进行比较
if (nums[j] > nums[i])
{
//先将j~(i-1)位置上的元素依次后移,然后将nums[i]插入至j位置
int tmp = nums[i];
moveElements(nums, j, i);
nums[j] = tmp;
}
}
}
return nums;
}
};
int main()
{
Solution solution;
std::vector<int> nums = {4, 5, 2, 6, 1};
solution.sortArray(nums);
for (int i = 0; i < 5; i++)
{
printf("%d",nums[i]);
}
}