目录
一.插入排序
插入类排序的基本思想是:每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。如果要对具有n个元素的数组a进行排序,初始状态时,可以认为已排序序列为a[0],待排序序列为a[1]~a[n-1],排序过程如图所示。在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序法,下面只介绍最简单的直接插入排序法。
#include<iostream>
#include<iomanip>
using namespace std;
//用直接插入排序法对数组a中的元素进行升序排序
template <class T>
void insertionSort(T a[], int n)
{
int i, j;
T temp;
//将下标为1~n-1的元素逐个插入到已排序序列中适当位置
for (int i=1; i < n; i++)
{
//从a[i-1]开始向a[0]方向扫描各元素,寻找适当位置插入a[i]
int j = i;
T temp = a[i];
while (j > 0 && temp < a[j - 1])
{
//逐个比较,直到 temp >= a[j-1]时,j便是应插入的位置。若达到j==0,则0是应插入的位置
a[j] = a[j - 1]; //将元素逐个后移,以便找到插入位置时可立即插入
j--;
}
//插入位置已找到,立即插入
a[j] = temp;
for (int q = 0; q < n; q++) //每次排序查看数据元素位置
{
cout <<setw(3)<< a[q] << " ";
}
cout << endl;
}
}
int main()
{
int datal[] = {1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
insertionSort(datal, 20);
return 0;
}
二.选择排序
选择排序的基本思想是:每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。在选择类排序方法中,根据从待排序序列中选择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为简单选择排序,如图所示。
#pragma once
#include<iostream>
#include<iomanip>
using namespace std;
//辅助函数:交换x和y的值
template <class T>
void mySwap(T& x, T& y)
{
T temp = x;
x = y;
y = temp;
}
//用选择法对数组a的n个元素进行排序
template <class T>
void selectionSort(T a[], int n)
{
for (int i = 0; i < n - 1; i++)
{
int leastIndex = i; //最小元素下标初始值设为i
for (int j = i + 1; j < n; j++) //在元素a[i+1]..a[n-1]中逐个比较显出最小值
{
if (a[j] < a[leastIndex]) //leastIndex始终记录当前找到的最小值的下标
{
leastIndex = j;
}
}
mySwap(a[i], a[leastIndex]); //将这一趟找到的最小元素与a[i]交换
for (int q = 0; q < n; q++) //每次排序后查看数组
{
cout << setw(3) << a[q] << " ";
}
cout << endl;
}
}
int main()
{
int datal[] = {1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
selectionSort(datal, 20);
return 0;
}
三.冒泡排序
交换类排序的基本思想是:两两比较待排序序列中的元素,并交换不满足顺序要求的
各对元素,直到全部满足顺序要求为止。最简单的交换排序方法是冒泡排序。
对具有n个元素的序列按升序进行起泡排序的步骤如下:
(1)首先将第一个元素与第二个元素进行比较,若为逆序,则将两元素交换。然后比较第二、第三个元素,依次类推,直到第n-1和第n个元素进行了比较和交换。此过程称为第一趟起泡排序。经过第一趟,最大的元素便被交换到第n个位置。(2)对前n一1个元素进行第二趟起泡排序,将其中最大元素交换到第n一1个位置。
(3)如此继续,直到某一趟排序未发生任何交换时,排序完毕。对n个元素的序列,起泡排序最多需要进行n一1趟。
#pragma once
#include<iostream>
using namespace std;
//辅助函数:交换x和y的值
template <class t>
void myswap(t& x, t& y)
{
t temp = x;
x = y;
y = temp;
}
//用起泡法对数组A的n个元素进行排序
template <class T>
void bubbleSort(T a[], int n)
{
int i = n - 1; //i是下一趟需要参与排序交换的最大下标
while (i > 0) //持续排序过程,直到最后一趟没有交换发生,或已达n-1趟
{
int lastExchangeIndex = 0; //每一趟开始时,设置交换标志为0(未交换)
for (int j = 0; j < i; j++) //每一趟对元素a[0]..a[i]进行比较和交换
{
if (a[j + 1] > a[j]) //若元素a[j+1]<a[j],交换他们
{
myswap(a[j], a[j + 1]);
lastExchangeIndex = j; //记录被交换的一对元素中较小的下标
}
}
i = lastExchangeIndex; //将i设置为本趟被交换的最后一对元素中较小的下标
for (int q = 0; q < n; q++) //每次排序查看结果
{
cout << setw(3) << a[q] << " ";
}
cout << endl;
}
}
int main()
{
int datal[] = {1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
bubbleSort(datal, 20);
return 0;
}
好啦,就到这里啦,如果觉得对你有用的话,麻烦点个赞和关注~