C++ 交换排序(冒泡/快速排序)

前置知识

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 —百度百科

实现代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

void bubbleSort(int a[], int len) {//冒泡排序  从小到大
	bool flag;//用来标记是否存在交换
	for (int i = 0; i < len - 1; i++) {
		flag = false;
		for (int j = len - 1; j > i; j--) {
			if (a[j] < a[j - 1]) {
				swap(a[j], a[j - 1]);
				flag = true;
			}
		}
		if (!flag) return;//小优化  一趟下来没有交换便表示排好序了,返回即可
	}
}

int partition(int a[],int L,int R) {//快速排序  将子表排序并返回中心轴位置
	int key = a[L];
	while (L < R) {//从两边向中间遍历
		while (L<R && a[R]>=key) --R;    //从后往前找小于基准的
		a[L] = a[R];                     //移到前面
		while (L<R && a[L]<=key) ++L;    //从前往后找大于基准的
		a[R] = a[L];                     //移到后面
	}
	a[L] =key;   //遍历到相同位置,小于基准的都放在了这个位置前面,大于基准的都放在了这个位置后面,将基准放到这个位置
	/*for (int i = 0; i < 10; i++) cout << a[i] << " ";
	cout << endl;*/
	return L;    //返回中心轴位置
}

void qSort(int a[],int L,int R) {//快速排序
	if (L < R) {
		int mid = partition(a, L, R);
		qSort(a, L, mid - 1);
		qSort(a, mid + 1, R);
	}
}

int main() {
	int a[10];
	cout << "冒泡排序:" << endl;
	for (int i = 0; i < 10; i++) cin >> a[i];
	bubbleSort(a, end(a) - begin(a));        //冒泡排序
	for (int i = 0; i < 10; i++) cout << a[i] << " ";
    cout << endl;

	cout << "快速排序:" << endl;
	for (int i = 0; i < 10; i++) cin >> a[i];
	qSort(a, 0, end(a) - begin(a) - 1);        //快速排序
	for (int i = 0; i < 10; i++) cout << a[i] << " ";
	cout << endl;
	return 0;
}
//样例: 5 1 4 2 6 9 3 8 7 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是实现冒泡排序快速排序和斐波那契数列的C语言代码: 冒泡排序: ``` #include<stdio.h> #define MAX 100 void bubbleSort(int arr[], int n) { int i, j, temp; for(i=0; i<n-1; i++) { for(j=0; j<n-i-1; j++) { if(arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[MAX], n, i; printf("Enter the number of elements: "); scanf("%d", &n); printf("Enter the elements: "); for(i=0; i<n; i++) { scanf("%d", &arr[i]); } bubbleSort(arr, n); printf("Sorted array: "); for(i=0; i<n; i++) { printf("%d ", arr[i]); } return 0; } ``` 快速排序: ``` #include<stdio.h> #define MAX 100 int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low-1); int j, temp; for(j=low; j<=high-1; j++) { if(arr[j] <= pivot) { i++; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } temp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = temp; return (i+1); } void quickSort(int arr[], int low, int high) { if(low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi-1); quickSort(arr, pi+1, high); } } int main() { int arr[MAX], n, i; printf("Enter the number of elements: "); scanf("%d", &n); printf("Enter the elements: "); for(i=0; i<n; i++) { scanf("%d", &arr[i]); } quickSort(arr, 0, n-1); printf("Sorted array: "); for(i=0; i<n; i++) { printf("%d ", arr[i]); } return ### 回答2: 冒泡排序是一种简单的排序算法,可以按照从小到大或者从大到小的顺序将一个数组排序。算法的基本思想是将相邻的元素进行比较,如果顺序不对则进行交换,每一轮遍历可以确保一个元素位于正确的位置上。重复这个过程直至整个数组排序完成。以下是用C语言实现冒泡排序的代码: ```c #include <stdio.h> void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 快速排序是一种常用的排序算法,其基本原理是选择一个基准元素,将比基准元素小的放在左边,比基准元素大的放在右边,然后对左右两个子序列进行递归排序。以下是用C语言实现快速排序的代码: ```c #include <stdio.h> int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = temp; return i + 1; } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); quickSort(arr, 0, n-1); printf("排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 斐波那契数列是一个数列,其中每个数字都是前两个数字的和。以下是用C语言实现斐波那契数列的代码: ```c #include <stdio.h> int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n-1) + fibonacci(n-2); } int main() { int n = 10; printf("斐波那契数列前 %d 项:", n); for (int i = 0; i < n; i++) { printf("%d ", fibonacci(i)); } return 0; } ``` ### 回答3: 冒泡排序是一种简单的排序算法,它通过比较和交换相邻元素来逐渐将最大(或最小)的元素冒泡到数组的末尾。以下是使用C语言实现冒泡排序的代码示例: ```c #include <stdio.h> void bubbleSort(int arr[], int n) { int i, j; for (i = 0; i < n-1; i++) { for (j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("排序后的数组:"); for (int i=0; i < n; i++) printf("%d ", arr[i]); return 0; } ``` 快速排序是一种基于分治法的排序算法,通过选择一个基准元素,将数组划分为两个子数组,并对子数组分别进行排序。以下是使用C语言实现快速排序的代码示例: ```c #include <stdio.h> void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); quickSort(arr, 0, n-1); printf("排序后的数组:"); for (int i=0; i < n; i++) printf("%d ", arr[i]); return 0; } ``` 斐波那契数列是一种常见的数列,其中每个数字都是前两个数字的和。以下是使用C语言实现斐波那契数列的代码示例: ```c #include <stdio.h> int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n-1) + fibonacci(n-2); } int main() { int n = 10; printf("斐波那契数列前 %d 项:", n); for (int i = 0; i < n; i++) printf("%d ", fibonacci(i)); return 0; } ``` 以上便是分别使用C语言实现冒泡排序快速排序和斐波那契数列的代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值