排序算法(初分为两部分)
冒泡排序
前后数据两两间相互比较大小
图像演示
代码实现 (输入一组数据的个数,然后依次输入该组数据的内容,进行正序排列)
#include<bits/stdc++.h>
using namespace std;
#define N 100
void swap_sort(int arr[], int x, int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
void Bubblesort(int arr[], int length) {
for (int i = 0; i < length - 1; i++) {//外层循环是排序次数,例:5组数就要比较4次,及数组长度减1
for (int j = 0; j < length - 1 - i; j++) {//内层循环是比较数据,外层循环每一次就可以确定最后面一位数,所以lengt-1-i表示外层循环第i次,内层可以少比较下标为length-1-i的这个数
if (arr[j] > arr[j + 1]) {
swap_sort(arr, j + 1, j);
}
}
}
}
int main() {
int arr[N], n, i;
cin >> n;//n为输入的数的个数
for (i = 0; i < n; i++) {
cin >> arr[i];
}
Bubblesort(arr, n);
for (i = 0; i < n; i++) {
cout << arr[i]<<" ";
}
return 0;
}
快速排序
图像演示
1.选择数据中的一个数为基准。
2.利用分治思想,把比基准数据小的放到前面。
3.重复以上操作,将分区完后小于原基准数据和大于原基准的数据再分别确定基准进行子数列排序。
视频解析,感谢up主的技术分享
代码实现(输入一组数据的个数,然后依次输入该组数据的内容,进行正序排列)
#include <bits/stdc++.h>
using namespace std;
#define N 1000
int part(int arr[], int low, int hight) //划分函数
{
int i = low, j = hight, pivot = arr[low]; //基准元素
while (i < j)
{
while (i<j && arr[j]>pivot) //从右向左开始找一个 小于等于 pivot的数值
{
j--;
}
if (i < j)
{
swap(arr[i++], arr[j]); //r[i]和r[j]交换后 i 向右移动一位
}
while (i < j && arr[i] <= pivot) //从左向右开始找一个 大于 pivot的数值
{
i++;
}
if (i < j)
{
swap(arr[i], arr[j--]); //r[i]和r[j]交换后 i 向左移动一位
}
}
return i; //返回最终划分完成后基准元素所在的位置
}
void Quicksort(int arr[], int low, int hight)
{
int mid;
if (low < hight)
{
mid = part(arr, low, hight); // 返回基准元素位置
Quicksort(arr, low, mid - 1); // 左区间递归快速排序
Quicksort(arr, mid + 1, hight); // 右区间递归快速排序
}
}
int main()
{
int arr[N],n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
Quicksort(arr, 0, n - 1);
for (int i = 0; i < n ; i++)
{
cout << arr[i] << " ";
}
return 0;
}
归并排序
1.将序列中带排序数字分为若干组,每个数字分为一组
2.将若干个组两两合并,保证合并后的组是有序的
3.重复第二步操作直到只剩下一组,排序完成
视频链接,感谢up主的知识分享
代码实现
#include<bits/stdc++.h>
using namespace std;
#define N 1000
void merge(int arr[], int len) {
int* a = arr;
int* b = new int[len];
for (int seg = 1; seg < len; seg += seg) {
for (int start = 0; start < len; start += seg + seg) {
int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2)
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
}
int* temp = a;
a = b;
b = temp;
}
if (a != arr) {
for (int i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
delete[] b;
}
void mergesort(int arr[], int low, int hight) //归并排序
{
if (low < hight)
{
int mid = (low + hight) / 2;
mergesort(arr, low, mid); //对 a[low,mid]进行排序
mergesort(arr, mid + 1, hight); //对 a[mid+1,hight]进行排序
merge(arr,hight-low+1); //进行合并操作
}
}
int main()
{
int arr[N], n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
mergesort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}