Loading

排序算法学习笔记

排序算法

冒泡排序

正序:将最大的不断交换到序列末尾

   
 void bubble_sort(int *arr,int n){
	if(n<2)  return ;
	// 冒泡排序
	
	for(int end = n-1;end>0;end--){
		bool sorted = true;
		for(int i = 0;i<end;i++){
			if(arr[i]>arr[i+1]){
				//swap 大的往后,最后i=end-1, i+1 = end;
				sorted = false;
				int t = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = t;
			}
		}
		// 已经有序
		if(sorted) break;
	}
}

选择排序

每一次选择最大的/最小的到最新有序序列末尾

插入排序

将有序序列的下一个数字插入到有序数列中

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(int *nums,int l,int r){
	// 定基准
	if(l>=r) return;
	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,j);
	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();
			
        }
    }
    
posted @ 2025-10-23 09:39  GIPV  阅读(13)  评论(0)    收藏  举报