六种常见排序(冒泡、选择、插入、希尔、归并、快排)代码存档

本文详细介绍了五种常用的排序算法:冒泡排序、选择排序、插入排序、希尔排序和快速排序。每种算法都提供了详细的实现代码,包括算法的具体步骤和关键操作,如元素交换和比较。此外,还介绍了归并排序的递归实现,展示了如何将数组拆分为更小的部分,然后逐步合并已排序的子序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

//冒泡排序
void BubbleSort(int a[], int len){
    for(int i = 0; i < len; i++){
        for(int j = i; j < len; j++){
            if(a[i] > a[j]){
                int tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }
}

//选择排序,每次将最小的元素找出来放在最前面
void SelectionSort(int a[], int n){
    for(int i = 0; i < n; i++){
        int minn = i;
        for(int j = i; j < n; j++)
            if(a[j] < a[minn])
                minn = j;
        int tmp = a[i];
        a[i] = a[minn];
        a[minn] = tmp;
    }
}

//插入排序,从前往后查找,每次找到逆序就把他向前移动至非逆序位置
void InsertionSort(int a[], int n){
	for(int i = 1; i < n; i++){
		int j = i;
        int temp = a[i];
		while(j > 0 && a[j-1] > temp){
			a[j] = a[j-1];
			j--;
		}
        a[j] = temp;
	}
}

//希尔排序 跳跃性的插入排序
void ShellSort(int a[], int len){
    int h = 1;
    int tmp;
    while(h < len / 3){
        h = 3 * h + 1;
    }
    int i, j;
    while(h >= 1){
        for(i = h; i < len; i++){
            tmp = a[i];
            for(j = i; j >= h && a[j-h] > tmp; j -= h){
                a[j] = a[j-h];
            }
            a[j] = tmp;
        }
        h = h / 3;
    }
}

//归并排序,递归拆分成只含一个元素的子序列,逐步再合并
void MergeSort(int a[], int start, int end, int temp[]){
    if(end - start > 1){  //递归结束条件
        int mid = start + (end - start) / 2;  //防止爆 int
        int i = start, j = mid, k = start;
        MergeSort(a, start, mid, temp);  //归并左边
        MergeSort(a, mid, end, temp);  //归并右边
        while(i < mid || j < end){
            if(j >= end || (i < mid && a[i] <= a[j])){
                temp[k++] = a[i++];
            }else{
                temp[k++] = a[j++];
            }
        }
        for(i = start; i < end; i++){
            a[i] = temp[i];  //从临时数组复制到原数组
        }
    }
}

//快速排序 每一轮后被排序的元素放在了应该在的位置
void QuickSort(int a[], int low, int high){
    if(low >= high) return;
    int left = low, right = high;
    int key = a[left];
    while(left != right){
        int tmp;
        while(left != right && a[right] >= key) right--;
        tmp = a[right];
        a[right] = a[left];
        a[left] = tmp;
        while(left != right && a[left] <= key) left++;
        tmp = a[left];
        a[left] = a[right];
        a[right] = tmp;
    }
    QuickSort(a, low, left-1);
    QuickSort(a, left+1, high);
}

int main(){
    int a[10] = {2, 3, 99, 5, 7, 2, 8, 45, 77, 11};

    // BubbleSort(a, 10);

    // SelectionSort(a, 10);

    // InsertionSort(a, 10);

    // ShellSort(a, 10);

    // int temp[10];  //临时数组
    // MergeSort(a, 0, 9, temp);

    // QuickSort(a, 0, 9);

    //输出排序后的数组
    for(int i = 0; i < 10; i++)
        cout << a[i] << ' ';
    cout << endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值