****/*插入排序*/
void InsertionSort(vector<int> &nums){
for(int i = 1 ; i < nums.size() ; i++){
int base = nums[i];
int j = i - 1;
while(j >= 0&&nums[j] > base){
nums[j+1] = nums[j];
j--;
}
nums[j+1] = base;
}
}
/*选择排序*/
void SelectionSort(vector<int> &nums){
int n = nums.size();
for(int i = 0 ; i < n-1 ; i++){
int k = i ;
for(int j = i + 1 ; j < n ; j++){
if(nums[j] < nums[k])
k = j;
}
swap(nums[k],nums[i]);
}
}
/*冒泡排序*/
void bubbleSort(vector<int> &nums){
for(int i = 0 ; i < nums.size()- 1; i++){
for(int j = 0 ; j < nums.size()- i -1 ; j++ ){
if(nums[j] > nums[j+1])
swap(nums[j],nums[j+1]);
}
}
}
/*快速排序*/
void quickSort(vector<int>&nums,int left ,int right){
int i = left;
int j = right;
if(left >= right){
return ;
}
int pivot = nums[left];
while(i < j){
while(i < j&&nums[j] > pivot){
j--;
}
//nums[i] = nums[j];
while(i < j&&nums[i] <= pivot){
i++;
}
//nums[j] = nums[i];
swap(nums[j],nums[i]);
}
//nums[j] = pivot;
swap(nums[left],nums[i]);
quickSort(nums,left,j-1);
quickSort(nums,j+1,right);
}
/*归并排序*/
/* 合并左子数组和右子数组 */
void merge(vector<int> &nums, int left, int mid, int right) {
// 左子数组区间为 [left, mid], 右子数组区间为 [mid+1, right]
// 创建一个临时数组 tmp ,用于存放合并后的结果
vector<int> tmp(right - left + 1);
// 初始化左子数组和右子数组的起始索引
int i = left, j = mid + 1, k = 0;
// 当左右子数组都还有元素时,进行比较并将较小的元素复制到临时数组中
while (i <= mid && j <= right) {
if (nums[i] <= nums[j])
tmp[k++] = nums[i++];
else
tmp[k++] = nums[j++];
}
// 将左子数组和右子数组的剩余元素复制到临时数组中
while (i <= mid) {
tmp[k++] = nums[i++];
}
while (j <= right) {
tmp[k++] = nums[j++];
}
// 将临时数组 tmp 中的元素复制回原数组 nums 的对应区间
for (k = 0; k < tmp.size(); k++) {
nums[left + k] = tmp[k];
}
}
void mergeSort(vector<int> &nums,int left ,int right){
if(left >= right)//数组长度为一时停止
return ;
int mid = (left + right) / 2;
mergeSort(nums,left,mid);
mergeSort(nums,mid+1 ,right);
//合并阶段
merge(nums,left,mid,right);
}
排序算法(插入、选择、冒泡、快速、归并)CPP
最新推荐文章于 2024-10-10 23:12:18 发布