几大排序算法-C++版

几种排序算法的比较:

冒泡排序

#include <iostream>
using namespace std;

//冒泡排序
void bubble_sort(int array[],int size) {
	int i, j;
	for (i = size-1 ; i > 0; i--) {
		for (j = 0; j < i ; j++) {
			if (array[j] > array[j + 1]) {
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
			}
		}
	}
}

int main(void) {
	int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
	bubble_sort(src_array,10);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}
//递归版本
void sort(int array[], int size) {
	int i, j;
	for (i = size - 1; i > 0; i--) {
		for (j = 0; j <= i; j++) {
			if (array[j] > array[j + 1]) {
				int tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
			}
		}
	}
}

//冒泡排序
void bubble_sort(int array[], int size) {
	if (size > 1) {
		sort(array, size - 1);
	}
}

选择排序

#include <iostream>
using namespace std;

//选择排序
void select_sort(int array[],int size) {
	int i, j, min;
	for (i = 0; i < size - 1; i++) {   //总共需要进行N-1轮比较
		min = i;
		for (j = i + 1; j < size; j++) {   //每轮需要进行N-i次比较
			if (array[j] < array[min]) {
				min = j;    //记录找到的最小元素的位置
			}
		}
		//进行值的互换
		if (i != min) {
			int tmp = array[i];
			array[i] = array[min];
			array[min] = tmp;
		}
	}
}

int main(void) {
	int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
	select_sort(src_array,10);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}

插入排序

#include <iostream>
using namespace std;

//插入排序
void insert_sort(int array[],int size) {
	// 从下标为1的元素开始选择合适的位置进行插入
	for (int i = 1; i < size; i++) {
		int tmp = array[i];  //记录要插入的数据
		int j = i;
		while (j > 0 && tmp < array[j - 1]) {
			array[j] = array[j - 1];
			j--;
		}
		if (j != i)   //存在比其小的数,则插入
			array[j] = tmp;
	}
}

int main(void) {
	int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
	insert_sort(src_array,10);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}

快速排序

#include <iostream>
using namespace std;

void myswap(int arr[], int a, int b) {
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
}

int partition(int arr[], int left, int right) {
	int pivot = left;
	int index = pivot + 1;
	for (int i = index; i <= right; i++) {
		if (arr[i] < arr[pivot]) {
			myswap(arr, i, index);
			index++;
		}
	}
	myswap(arr, pivot, index - 1);
	return index - 1;
}
//快速排序
void quick_sort(int array[], int left, int right) {
	if (left < right) {
		int parIndex = partition(array, left, right);
		quick_sort(array, left, parIndex - 1);
		quick_sort(array, parIndex + 1, right);
	}
}

int main(void) {
	int src_array[10] = {8,3,2,1,4,17,15,12,11,13};
	quick_sort(src_array,0,9);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}

归并排序

#include <iostream>
#include <cstring>
using namespace std;

void merge(int arr[],int left,int right,int mid) {
	int a = left, b = right, len = right - left + 1;
	int k = mid + 1, i = 0;
	int *array = new int[len];
	while (a <= mid && k <= right) {  //判断是否两个数组都检完
		if (arr[a] <= arr[k])
			array[i++] = arr[a++];
		else
			array[i++] = arr[k++];
	}
	while (a <= mid) {    //第一个表还没检完
		array[i++] = arr[a++];
	}
	while (k <= right) {      //第二个表还没检完
		array[i++] = arr[k++];
	}
	for (int j = 0; j < len; j++) {   //拷贝回原来的数组
		arr[left + j] = array[j];
	}
	delete[]array;
}

//归并排序
void merge_sort(int arr[], int left, int right) {
	if (left < right) {
		int mid = (left + right) / 2;
		merge_sort(arr, left, mid);
		merge_sort(arr,mid+1,right);
		merge(arr, left, right, mid);
	}
}

int main(void) {
	int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
	merge_sort(src_array,0,9);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}

希尔排序

#include <iostream>
using namespace std;

void shell_sort(int array[],int n){
	int gap = n/2;
	while(gap > 0){
		for(int i = 0; i < gap; i++){
			for(int j = i + gap; j < n; j += gap){
				if(array[j] < array[j-gap]){
					int temp = array[j];
					int k = j - gap;
					while(k >= 0 && array[k] > temp){
						array[k+gap] = array[k];
						k -= gap;
					}
					array[k+gap] = temp;
				}
			}
		}
		gap /= 2;
	}
} 

int main(void) {
	int src_array[10] = {4,5,1,9,2,8,3,7,5,6};
	shell_sort(src_array,10);
	for (int i = 0; i < 10;i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}

堆排序

#include <iostream>
using namespace std;

void swap(int arr[], int a, int b) {
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
}

void heap_adjust(int arr[], int cur ,int n) {
	int tmp, j;
	tmp = arr[cur];
	for (j = 2 * cur; j <= n; j *= 2) {
		if (j < n && arr[j] < arr[j + 1])
			++j;
		if (tmp >= arr[j])
			break;
		arr[cur] = arr[j];
		cur = j;
	}
	arr[cur] = tmp;
}

void heap_sort(int array[], int n) {
	for (int i = n / 2; i > 0; i--)
		heap_adjust(array, i, n);
	for (int i = n; i > 1; i--) {
		swap(array, 1, i);
		heap_adjust(array, 1, i - 1);
	}
}

int main() {
	int src_array[11] = { 0,4,5,1,9,2,8,3,7,5,6 };
	heap_sort(src_array, 10);
	for (int i = 1; i < 11; i++) {
		cout << src_array[i] << " ";
	}
	cout << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值