排序算法学习笔记
排序算法
冒泡排序
正序:将最大的不断交换到序列末尾
void Bubble_sort(vector<int> &nums){
int n = nums.size();
bool flag = 0;
for(int i = 0;i<n-1;i++){
flag = 0;
for(int j = 0;j<n-i-1;j++){
if(nums[j]>nums[j+1]){
// swap(nums[j],nums[j+1]);
int t = nums[j];
nums[j] = nums[j+1];
nums[j+1] = t;
flag= 1;
}
}
// 优化:有序后直接,排序结束
if(flag == 0) break;
}
}
选择排序
每一次选择最大的/最小的到最新有序序列末尾
void select_sort(vector<int> &nums){
int n = nums.size();
for(int i = 0;i<n;i++){
for(int j = i+1;j<n;j++){
if(nums[j]>nums[i]){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
}
}
插入排序
将有序序列的下一个数字插入到有序数列中
void insert_sort(vector<int> &nums){
for(int i = 1;i<nums.size();i++){
int key = nums[i];
int j = i-1;
while (j>=0 && nums[j]>key)
{
/* code */
nums[j+1] = nums[j];
j--;
}
nums[j+1] = key;
}
}
快速排序
子问题:荷兰国旗问题
void quick_sort(vector<int> &nums,int l,int r){
// 定基准
const int pivot = nums[l+(rand()%(r-l))];
int j,k,i;
// partion
i = l;
j = l;
k = r;
while (i<k)
{
if(nums[i]<pivot){
swap(nums[i++],nums[j++]);
}
else if(nums[i]>pivot){
swap(nums[--k],nums[i]);
}else{
i++;
}
}
quick_sort(nums,l,i);
quick_sort(nums,k,r);
}
归并排序
两个步骤
1、左右连部分各自排序
2、左右部分合并到一起
void merge_sort(vector<int> &nums,int l,int r){
if (l>=r) return ;
int mid = l+((r-l)>>1);
// 分
int l1 = l,r1 = mid;
int l2 = mid+1,r2 = r;
merge_sort(nums,l1,r1);
merge_sort(nums,l2,r2);
// 合
vector<int> temp;
int k = l;
// 比较
while (l1<=r1 && l2<=r2)
{
/* code */
if(nums[l1]<nums[l2]){
temp.push_back(nums[l1++]);
}else{
temp.push_back(nums[l2++]);
}
}
while (l1<=r1)
{
temp.push_back(nums[l1++]);
}
while (l2<=r2)
{
temp.push_back(nums[l2++]);
}
for(int i = l;i<=r;i++){
nums[i] = temp[i-l];
// temp.pop_back();
}
}

浙公网安备 33010602011771号