【四种排序代码】

  1. 计数排序

#include <bits/stdc++.h>

#define N 1000005

#define K 1000001// 假设非负整数最大元素范围为1000000

using namespace std;

int a[N], n, b[N];

int cnt[K];

int main() {

// 输入

cin >> n;

for (int i = 1; i <= n; ++i) {

cin >> a[i];

++cnt[a[i]];// 这里通过计数数组cnt来维护每一种值出现的次数

}

// 维护最终有序序列

for (int i = 0, j = 0; i < K; ++i) // 枚举每一种值i,指针j用来枚举填充答案数组中的位置

for (int k = 1; k <= cnt[i]; ++k) // 根据该值出现的次数

b[++j] = i; // 添加对应个数的i到答案序列

// 输出

for (int i = 1; i <= n; ++i)

cout << b[i] << ' ';

cout << endl;

return 0;

}

  1. 冒泡排序

#include <stdio.h>

#define ARR_LEN 255 /*数组长度上限*/

#define elemType int /*元素类型*/

/* 冒泡排序 */

/* 1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换 */

/* 2. 对所有元素均重复以上步骤,直至最后一个元素 */

/* arr[]: 排序目标数组; int length: 元素个数 */

void BubbleSort(int arr[], int length)

{

for (int i = 0; i < length; i++)

{

for (int j = 0; j < length - i - 1; j++)

{

if (arr[j] > arr[j + 1])

{

int temp;

temp = arr[j + 1];

arr[j + 1] = arr[j];

arr[j] = temp;

}

}

}

}

int main (void) {

elemType arr[ARR_LEN] = {3,5,1,-7,4,9,-6,8,10,4};

int len = 10;

// int len = sizeof(arr) / sizeof(arr[0]); 获取数据长度

int i;

BubbleSort(arr, len);

for (i=0; i<len; i++)

printf ("%d\t", arr[i]);

putchar ('\n');

return 0;

}

  1. 插入排序

/* 插入排序 */

void insertion_sort(int arr[], int len){

int i,j,key;

for (i=1;i<len;i++){

key = arr[i];

j=i-1;

while((j>=0) && (arr[j]>key)) {

arr[j+1] = arr[j];

j--;

}

arr[j+1] = key;

}

}

  1. 快速排序

// 快速排序

void QuickSort(int arr[], int start, int end)

{

if (start >= end)

return;

int i = start;

int j = end;

// 基准数

int baseval = arr[start];

while (i < j)

{

// 从右向左找比基准数小的数

while (i < j && arr[j] >= baseval)

{

j--;

}

if (i < j)

{

arr[i] = arr[j];

i++;

}

// 从左向右找比基准数大的数

while (i < j && arr[i] < baseval)

{

i++;

}

if (i < j)

{

arr[j] = arr[i];

j--;

}

}

// 把基准数放到i的位置

arr[i] = baseval;

// 递归

QuickSort(arr, start, i - 1);

QuickSort(arr, i + 1, end);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值