C/C++基础排序

插入排序法

在这里插入图片描述

 #include<stdio.h>
 
 /* 
  插入排序法 
  一、将开头元素视为已排序
  二、执行下述处理,直至排序部分消失
     1. 取出未排序部分的开头元素赋给变量v;
	 2. 在已排序部分,将所有比v大的元素向后移动一个单位;
	 3. 将已取出的元素v插入空位; 
*/ 
 
 /* 按顺序输出数组元素 */
 void trace (int A[], int N) {
 	int i;
 	for (i = 0; i < N; i++){
 		if (i > 0) printf(" ");
 		printf("%d", A[i]);
 	}
 	printf("\n");
 }
 
 /* 插入排序( 0起点数组)*/ 
 void insertionSort(int A[], int N){
 	int j, i, v;
 	for (i = 1; i < N; i++){
 		v = A[i];
 		j = i - 1;
 		while ( j >= 0 && A[j] > v){
 			A[j + 1] = A[j];
 			j--;
 		}
 		A[j + 1] = v;
 		trace(A, N);
 	}
 }
 
 int main(){
 	int N, i, j;
 	int A[100];
 	
 	scanf("%d", &N);
 	for (i = 0; i < N; i++) scanf("%d", &A[i]);
 	
 	trace(A, N);
 	insertionSort(A, N);
 	
 	return 0;
 }
 

程序运行结果

冒泡排序法

在这里插入图片描述

#include<iostream>
using namespace std;

/*
 一、重复执行下述处理,直到数组中不包含顺序相反的相邻元素
    1. 从数组末尾开始一次比较相邻两个元素,如果大小关系相反则交换位置
*/ 

// 使用flag的冒泡排序法
int bubbleSort(int A[], int N){
	int sw = 0;
	bool flag = 1;
	for (int i = 0; flag; i++){
		flag = 0;
		for (int j = N - 1; j >= i + 1; j--){
			if (A[j] < A[j - 1]){
				swap(A[j], A[j - 1]) ;
				flag = 1;
				sw++;
			}
		}
	}
	return sw;
} 

int main(){
	int A[100], N, sw;
	cin >> N;
	for (int i = 0; i < N; i++) cin >> A[i];
	
	sw = bubbleSort(A, N);
	
	for (int i = 0; i < N; i++){
		if (i) cout << " ";
		cout << A[i]; 
	}
 
	cout << endl;
	cout << sw << endl;
	return 0;
}

程序运行结果

选择排序法

在这里插入图片描述

#include<stdio.h>

/*
 一、重复执行N-1此下述处理
     1. 找出未排序部分最小值的位置minj;
	 2. 将minj位置的元素与未排序部分的起始元素交换;
*/ 

/* 选择排序法(0起点) */
int selectionSort(int A[], int N){
	int i, j, t, sw = 0, minj;
	for (i = 0; i < N - 1; i++){
		minj = i;
		for (j = i; j < N; j++){
			if (A[j] < A[minj]) minj = j;
		}
		t = A[i]; A[i] = A[minj]; A[minj] = t;
		if (i != minj) sw++;
	}
	return sw;
} 

int main(){
	int A[100], N, i, sw;
	
	scanf("%d", &N);
	for (i = 0; i < N; i++) scanf("%d", &A[i]);
	
	sw = selectionSort(A, N);
	
	for (i = 0; i < N; i++){
		if (i) printf(" ");
		printf("%d", A[i]);
	} 
	printf("\n");
	printf("%d\n", sw);
	
	return 0;
}

程序运行结果

希尔排序

在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;

long long cnt;
int l;
int A[1000000];
int n;
vector<int> G;

void insertionSort(int A[], int n, int g){
	for (int i = g; i < n; i++){
		int v = A[i];
		int j = i - g;
		while (j >= 0 && A[j] > v){
			A[j + g] = A[j];
			j -= g;
			cnt++;
		}
		A[j + g] = v;
	}
}

void shellSort(int A[], int n){
	for (int h = 1; ;){
		if (h > n) break;
		G.push_back(h);
		h = 3*h + 1;
	}
	for (int i = G.size()-1; i >= 0; i--){
		insertionSort(A, n, G[i]);
	}
}

int main(){
	cin >> n;
	for (int i = 0; i < n; i++) scanf("%d", &A[i]);
	cnt = 0; 
	
	shellSort(A, n);
	
	cout << G.size() << endl;
	for (int i = G.size() - 1; i >= 0; i--){
		printf("%d", G[i]);
		if (i) printf(" ");
	}
	printf("\n");
	printf("%d\n", cnt);
	for (int i = 0; i < n; i++) printf("%d\n", A[i]);
	
	return 0; 
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值