// 插入排序
// 从第二个元素,将其与它前面的元素比较,
// 如果前面的元素比该元素小,就将该元素插到前面,
// 如果前面元素比这个元素大,直接跳出
void insertSort(vector<int>& nums)
{
for (int i = 1; i < nums.size(); i++)
{
int temp = nums[i];
for (int j = i - 1; j >= 0; j--)
{
if (nums[j] > temp)
{
nums[j + 1] = nums[j];
nums[j] = temp;
}
else break;
}
}
}
调用时直接传递数组即可,插入排序个人理解是,从后往前插,自然就要有比较
故第一个循环 i 的下标初始值设为1,这样下标 1 前面还有下标 0 元素可以比较。
若理解有误,欢迎之争
// 选择排序, 固定第一个,从第二个往后面的数都与第一个比较,小于他则交换,放到前面
void selectSort(vector<int>& nums)
{
for (int i = 0; i < nums.size() - 1; i++)
{
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[i] > nums[j])
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
// 冒泡排序
void bubbleSort(vector<int>& nums)
{
for (int i = 0; i < nums.size() - 1; i++) //
{
for (int j = 0; j < nums.size() - i - 1; j++)
// 因为大的元素都冒泡交换到尾部了,所以nums - i - 1
{
if (nums[j + 1] < nums[j]) // 里面循环不断冒泡, 控制冒泡的相互的比较
{
int temp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = temp;
}
}
}
}
// 归并排序,
/*===========================================
将数组不断两两划分,直至划分到一个元素为止
再进行合并,合并时比较头元素大小,放入新数组里面
最后将新数组赋给原始数据
============================================*/
void merge(vector<int>& nums, int begin, int mid, int end, int temp[])
{
int i, j, k;
i = k = begin;
j = mid + 1;
while (i <= mid && j <= end)
{
if (nums[i] > nums[j]) temp[k++] = nums[j++];
else temp[k++] = nums[i++];
}
while (i <= mid) temp[k++] = nums[i++];
while (j <= end) temp[k++] = nums[j++];
for (int i = begin; i <= end; i++)
{
nums[i] = temp[i];
}
}
void mergeSort(vector<int>& nums, int begin, int end)
{
int* temp = new int[nums.size()];
if (begin < end)
{
int mid = (begin + end) / 2;
mergeSort(nums, begin, mid);
mergeSort(nums, mid + 1, end);
merge(nums, begin, mid, end, temp);
}
delete []temp;
}