1.冒泡排序法
英文:bubble sort ????(bubble 动和名词 起泡,冒泡) 从头到尾相邻的两个元素进行比较 大小顺序不满足就交换两个元素位置
每一轮比较会让一个最大数字沉底或者一个最小数字上浮
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
从小到大:
#include <iostream>
using namespace std;
void bubble_sort(int arr[], int len)
{
int temp;
for (int i = 0; i < len - 1; ++i)
{
for (int j = 0; j < len - 1 - i; ++j)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:" ;
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
bubble_sort(arr, 10);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
}
排序前数组:25 25 1 7 8 19 289 25 46 93 排序后数组:1 7 8 19 25 25 25 46 93 289
2.选择排序法
它的工作原理是 每一次从待排序的数据元素中 选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
#include <iostream>
using namespace std;
void select_sort(int arr[], int len)
{
int k, temp;
for (int i = 0; i < len - 1; ++i)
{
k = i;
for (int j = i + 1; j < len; ++j)
{
if (arr[k] > arr[j])
{
k = j;
}
}
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:" ;
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
select_sort(arr, 10);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
}
排序前数组:25 25 1 7 8 19 289 25 46 93 排序后数组:1 7 8 19 25 25 25 46 93 289
3.直接插入排序
基本操作就是:将有序数据后的第一个元素 插入到 已经排好序的有序数据中 从而得到一个新的、个数加一的有序数据
算法解释:(从小到大)
算法三个步骤:
先保留要插入的数字 往后移 插入元素
#include <iostream>
using namespace std;
void insert_sort(int arr[], int len)
{
int temp;
for (int i = 1; i < len; ++i)
{
for (int j = 0; j < i; ++j)
{
if (arr[j] > arr[i])
{
temp = arr[i];
for (int k = i - 1; k >= j; --k)
{
arr[k + 1] = arr[k];
}
arr[j] = temp;
break;
}
}
}
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:" ;
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
insert_sort(arr, 10);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
}
排序前数组:25 25 1 7 8 19 289 25 46 93 排序后数组:1 7 8 19 25 25 25 46 93 289
4.快速排序
4.1用递归实现
它的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据 都比 另外一部分的所有数据 都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
#include <iostream>
using namespace std;
int part(int arr[], int begin, int end)
{
int temp;
int i = begin, j = end;
while (i < j)
{
while (i<j && arr[j]>arr[begin]) --j;
while (i < j && arr[i] <= arr[begin]) ++i;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
temp = arr[begin];
arr[begin] = arr[i];
arr[i] = temp;
return i;
}
void quick_sort(int arr[], int begin, int end)
{
if (begin >= end) return;
int k = part(arr, begin, end);
quick_sort(arr, begin, k - 1);
quick_sort(arr, k + 1, end);
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:" ;
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
quick_sort(arr,0,9);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " " ;
}
排序前数组:25 25 1 7 8 19 289 25 46 93 排序后数组:1 7 8 19 25 25 25 46 93 289
5.归并排序
排序原理:
- 尽可能的将一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。
- 将相邻的两个子组进行合并成一个有序的大组;
- 不断的重复步骤2,直到最终只有一个组为止。
#include<iostream>
#include<iomanip>
using namespace std;
int a[101];
void Merge(int* arr, int left, int mid, int right)
{
int* temp = new int[right - left + 1];
int st1 = left;
int st2 = mid + 1;
int t = 0;
while (st1 <= mid && st2 <= right)
{
temp[t++] = arr[st1] < arr[st2] ? arr[st1++] : arr[st2++];
}
while (st1 <= mid) {
temp[t++] = arr[st1++];
}
while (st2 <= right) {
temp[t++] = arr[st2++];
}
for (int j = 0; j < t; ++j) {
arr[left + j] = temp[j];
}
delete[] temp;
}
void MergeSort(int* arr, int start, int end) {
if (arr == NULL || start >= end)
return;
if (start < end)
{
int mid = (start + end) / 2;
MergeSort(arr, start, mid);
MergeSort(arr, mid + 1, end);
Merge(arr, start, mid, end);
}
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
MergeSort(arr, 0, 9);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
}
6.希尔排序
是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。
算法思想
- 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
- 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
图解: 代码实现:
#include<iostream>
#include<iomanip>
using namespace std;
void shellSort(int* arr, int n)
{
int gap, i, j, temp;
for (gap = n / 2; gap >= 1; gap = gap / 2)
{
for (i = gap; i < n; i++)
{
if (arr[i] < arr[i - gap])
{
temp = arr[i];
for (j = i - gap; j >= 0 && temp < arr[j]; j -= gap)
{
arr[j + gap] = arr[j];
}
arr[j + gap] = temp;
}
}
}
}
int main()
{
int arr[] = { 25,25,1,7,8,19,289,25,46,93 };
cout << "排序前数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
shellSort(arr,10);
cout << endl << "排序后数组:";
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
}
|