Cplusplus实现的冒泡排序
时间: 2023-01-29 12:34:25 浏览: 109
冒泡排序是一种简单的排序算法。它的基本原理是,重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
下面是 C++ 实现的冒泡排序代码:
```
#include <iostream>
#include <algorithm>
using namespace std;
void bubble_sort(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]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
cout << "排序后的数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
相关问题
Cplusplus实现的快速排序
### 回答1:
在 C++ 中实现快速排序的方式如下:
```
#include <iostream>
#include <algorithm>
using namespace std;
void quick_sort(int *arr, int left, int right)
{
// 如果左指针大于右指针,说明区间内的元素已经排好序
if (left > right)
return;
int i = left;
int j = right;
// 取左端点的值作为基准数
int pivot = arr[left];
while (i != j)
{
// 从右向左找到第一个小于基准数的数
while (arr[j] >= pivot && i < j)
j--;
// 从左向右找到第一个大于基准数的数
while (arr[i] <= pivot && i < j)
i++;
// 交换两个数
if (i < j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 最后将基准数与i和j相等位置的数交换
arr[left] = arr[i];
arr[i] = pivot;
// 递归左右两个区间
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
int main()
{
int arr[] = {3, 2, 4, 1, 5};
int len = sizeof(arr) / sizeof(int);
quick_sort(arr, 0, len - 1);
for (int i = 0; i < len; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
```
上面的代码是一个基于数组实现的快速排序算法。首先,定义一个快速排序函数,其中参数包括要排序的数组,以及数组的左右端点。然后,使用两个指针 i 和 j,从数组的两端开始向中间扫描。从
### 回答2:
C++中的快速排序算法是一种常用的排序算法,它基于分治的思想,通过将数组分为两部分并递归地对每一部分进行排序,最终达到整个数组有序的目的。
在C++中实现快速排序,可以定义一个递归函数来完成排序过程。具体步骤如下:
1.选择数组中的一个元素作为基准(pivot),常用的选择方式是选择首元素或者随机选择一个元素。
2.将数组分为两部分,小于等于基准的元素放在左边,大于基准的元素放在右边。
3.将基准元素放在正确的位置,即将它与分割后的数组的中间元素交换。
4.递归地对左边和右边的子数组进行快速排序。
5.重复以上步骤,直到每个子数组只有一个元素时,排序完成。
下面是一个简单的C++代码示例:
```cpp
#include <iostream>
using namespace std;
void quickSort(int arr[], int left, int right) {
if (left < right) {
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
int main() {
int arr[] = {5, 2, 9, 1, 7, 6};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
cout << "排序后的数组:";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
```
以上代码使用递归来实现快速排序,首先选择数组的第一个元素作为基准,然后通过分割数组的方式实现排序。最后输出排序后的数组。
通过这样的实现,我们可以快速对数组进行排序,快速排序的时间复杂度为O(nlogn),在实际应用中具有较好的性能。
### 回答3:
快速排序是一种常用的排序算法,也可以用C++实现。下面是快速排序的实现过程:
1. 首先,需要编写一个辅助函数来交换两个元素的位置:
```cpp
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
```
2. 接下来,编写 partition 函数,用于将数组分为两个部分,并返回基准元素的位置:
```cpp
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;
}
```
3. 最后,编写快速排序函数,通过递归调用 partition 函数来排序子数组:
```cpp
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);
}
}
```
以上是用C++实现快速排序的过程。你可以使用这段代码来对任何整数数组进行排序。
cplusplus实现LZ78算法
以下是一个简单的 C++ 实现 LZ78 算法的示例代码:
```cpp
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
void lz78Encode(const string& s) {
unordered_map<string, int> dict;
int index = 0;
string w;
for (char c : s) {
string wc = w + c;
if (dict.find(wc) != dict.end()) {
w = wc;
} else {
dict[wc] = ++index;
cout << dict[w] << " ";
w = string(1, c);
}
}
if (!w.empty()) {
cout << dict[w];
}
}
void lz78Decode(const string& s) {
unordered_map<int, string> dict;
int index = 0;
string w;
for (char c : s) {
int k = c - '0';
if (dict.find(k) != dict.end()) {
w = dict[k];
} else if (k == index + 1) {
w += w[0];
} else {
cerr << "Invalid input" << endl;
return;
}
cout << w;
dict[++index] = w + w[0];
w = w.substr(1);
}
}
int main() {
string s = "abababcabababxyxyxyz";
cout << "Encoded: ";
lz78Encode(s);
cout << endl;
cout << "Decoded: ";
lz78Decode("1 2 3 4 5 2 6 7 8 9 10 11 12 13 14");
cout << endl;
return 0;
}
```
这段代码实现了 LZ78 编码和解码。`lz78Encode` 函数接收一个字符串,对其进行编码并输出编码后的结果,`lz78Decode` 函数接收编码后的字符串,对其进行解码并输出解码后的结果。
在编码时,我们使用一个哈希表 unordered_map 来维护字符串和其对应的编码编号。我们从左到右扫描输入字符串,对于当前的字符 c,我们将当前字符串加上 c 得到新的字符串 wc,如果 wc 已经在哈希表中出现过,则继续向右扩展字符串;否则,我们输出 w 的编码编号,并将 wc 加入哈希表中。
在解码时,我们使用一个哈希表 unordered_map 来维护编码编号和其对应的字符串。我们从左到右扫描编码后的字符串,对于当前的编码编号 k,我们根据哈希表中的值得到字符串 w,如果哈希表中不存在 k,则说明输入有误;否则,我们输出 w,并将 w + w[0] 加入哈希表中,同时将 w 的第一个字符删除。
以上是一个简单的 LZ78 算法的 C++ 实现,仅供参考。
阅读全文