排序算法大二上总结(简选,冒排,快排,归并)

简单选择

void Selectsort(int a[],int start,int n) {
	if(start==n-1)return ;
	for(int i=start;i<n;i++){
		if(a[start]>a[i])
		swap(a[start],a[i]);
	} 
	Selectsort(a,start+1,n);
}

冒泡排序

void Bubblesort(int a[],int start,int n){
	if(n == 1) return ;//当剩下最后一个数时 返回 
	int flag = 0;
	for(int i=start;i<n-1;i++){//n结束到倒数第二个数结束,因为if是往后比较 
		if(a[i]>a[i+1])
		{
			swap(a[i],a[i+1]);
			flag=1;
		}
	}
	if(flag == 0)return ;//注意 
	Bubblesort(a,start,n-1);
}

两个注意的点: 1. for循环到达为 i = n -1     2.n ==1 时停止

快排

void quickersort(int a[],int start,int end){
	if(start<end){
		int base = a[start];
		int left = start;
		int right = end;
		while(left<right){
			while(left<right&&a[right]>=base) right--;
			a[left] = a[right];
			while(left<right&&a[left]<=base) left++;
			a[right] = a[left];
		}
		a[left] = base;
	}
		quickersort(a,start, left - 1)
		quickersort(a,left+1,end);
}

归并排序

#include <iostream>
#include <vector>
using namespace std;
int a[10] = {1, 2, 5, 6, 4, 7, 9, 8, 3, 0};

void merge(int a[], int left, int mid, int right) {
    vector<int> temp(right - left + 1);//分配临时数组存储变量
	//定义 左半区第一个未排元素 
    int l_post = left;
    //定义 右半区第一个未排元素 
    int r_post = mid + 1;
    //临时数组的下标 
    int post = 0; 

	//合并两数组 
    while (l_post <= mid && r_post <= right) {//左半区第一个剩余元素小
        if (a[l_post] < a[r_post])
            temp[post++] = a[l_post++];
        else//右半区第一个剩余元素小 
            temp[post++] = a[r_post++];
    }
    
    //合并左半区剩余元素 
    while (l_post <= mid)
        temp[post++] = a[l_post++];
        
    //合并右半区剩余元素
    while (r_post <= right)
        temp[post++] = a[r_post++];
        
	//复制到原来的数组 
    for (int i = 0; i < post; i++) {
        a[left + i] = temp[i];
    }
}

void mergesort(int a[], int left, int right) {
	//只有一个元素就不需要排序,只需要执行归并 
    if (left < right) {//中间只有1个元素时不需要划分 
        int mid = (left + right) / 2;
        mergesort(a, left, mid);
        mergesort(a, mid + 1, right);
		//一边拆分一边合并 
        merge(a, left, mid, right);
    }
}
int main() {
    mergesort(a, 0, 9);//左右封闭进行排序 
    for (int i = 0; i < 10; i++)
        cout << a[i] << " ";
}

使用辅助数组进行排序,但是需要注意最后复制辅助数列到原数列的过程中,用到了left + i 

猜你喜欢

转载自blog.csdn.net/Brittney27/article/details/134670363
今日推荐