本文为作者学习笔记
欢迎交流讨论,喜欢的话点个赞吧
欢迎去看我的主页
: NicholasYe’s Hompage.
插入排序
- 原理:将一个元素放在合适的位置,并将其他的元素向前或向后一起移动一个位置
步骤:
- 从data[1]开始,因为只有一个元素的数组是已排序的
- temp存储data[i],用于将较小值放置于数组前方
- 从data[i]开始,以data[j]给data[j-1]赋值的方式向数列后方复制
- 结束条件:temp比data[j-1]大或者已经复制到数列最前方
- 替换较小的值
#include <iostream>
using namespace std;
void Insertation(int data[], int n, int way)
{
//升序排序
if (way == 0)
{
//从data[1]开始,因为只有一个元素的数组是已排序的
for (int i = 1, j; i < n; i++)
{
//temp存储data[i],用于将较小值放置于数组前方
int temp = data[i];
//从data[i]开始,以data[j]给data[j-1]赋值的方式向数列后方复制
//结束条件:temp比data[j-1]大或者已经复制到数列最前方
for (j = i; j > 0 && temp < data[j - 1]; j--)
data[j] = data[j - 1];
//替换较小的值
data[j] = temp;
}
}
//降序排序
else if (way == 1)
{
for (int i = 1, j; i < n; i++)
{
int temp = data[i];
for (j = i; j > 0 && temp > data[j - 1]; j--)
data[j] = data[j - 1];
data[j] = temp;
}
}
}
int main()
{
//定义数组大小
const int Num = 20;
int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
cout << "排序前:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//升序排序
Insertation(Arr, Num, 0);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//降序排序
Insertation(Arr, Num, 1);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
system("pause");
return 0;
}
选择排序
- 原理:从头开始,搜寻数组里面的最小值,并将它放在最小的位置
步骤:
- 对第i个数字进行替换
- 在i后面的数字中进行搜寻,搜索更小的数字,并进行替换
改进策略:
如果该值与最小值不相同则交换(此步骤可以减小交换/赋值次数)
#include <iostream>
using namespace std;
void Selectionsort(int data[], int n, int way)
{
//升序排序
if (way == 0)
{
//对第i个数字进行替换
for (int i = 0, j, least; i < n - 1; i++)
{
//在i后面的数字中进行搜寻,搜索更小的数字
for (j = i + 1, least = i; j < n; j++)
{
if (data[j] < data[least])
least = j;
}
//如果该值与最小值不相同则交换(此步骤可以减小交换/赋值次数)
if (least != i)
{
//将更小的数字与该数字进行调换
int temp = data[least];
data[least] = data[i];
data[i] = temp;
}
}
}
//降序排序
else if (way == 1)
{
for (int i = 0, j, least; i < n - 1; i++)
{
for (j = i + 1, least = i; j < n; j++)
{
if (data[j] > data[least])
least = j;
}
if (least != i)
{
int temp = data[least];
data[least] = data[i];
data[i] = temp;
}
}
}
}
int main()
{
//定义数组大小
const int Num = 20;
int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
cout << "排序前:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//升序排序
Selectionsort(Arr, Num, 0);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//降序排序
Selectionsort(Arr, Num, 1);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
system("pause");
return 0;
}
冒泡排序
- 原理:通过比较将较小的值一次一次换到最前方
步骤:
- 从第一个次交换开始,总共进行n-1次交换
- 从最后一个数字开始向上排序
- 将该数字与前面一个数字进行比较,若比前面小则交换
改进策略:
bool类型做标记,若有一次没有交换,即该数字与前面一个数字相等,则跳过一个回合
#include <iostream>
using namespace std;
void Bubblesort(int data[], int n, int way)
{
//升序排序
if (way == 0)
{
//bool类型做标记,若有一次没有交换,即该数字与前面一个数字相等,则跳过一个回合
//该行为可以减少冒泡排序的交换次数
bool change = true;
//从第一个次交换开始,总共进行n-1次交换
for (int i = 0; i < n - 1&&change; i++)
{
//从最后一个数字开始交换,将change默认为false
for (int j = n - 1,change= false ; j > i; --j)
{
//将该数字与前面一个数字进行比较,若比前面小则交换
if (data[j] < data[j - 1])
{
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
//发生交换,change改为true
change = true;
}
}
}
}
//降序排序
else if (way == 1)
{
bool change = true;
for (int i = 0; i < n - 1 && change; i++)
{
for (int j = n - 1, change = false; j > i; --j)
{
if (data[j] > data[j - 1])
{
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
change = true;
}
}
}
}
}
int main()
{
//定义数组大小
const int Num = 20;
int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
cout << "排序前:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//升序排序
Bubblesort(Arr, Num, 0);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//降序排序
Bubblesort(Arr, Num, 1);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
system("pause");
return 0;
}
梳排序
- 原理:梳排序并不是一种单独的排序方式,而是在排序之前先对数据预处理,将一些大的数字放在后面,小的数字放在前面,处理完后再进行排序,本例中用的是冒泡排序。
步骤:
- 初始化步长
- 因子s=1.3用来确定元素的位置之间的间距,减少step的大小直至step/1.3<1时结束
- data[j]与data[j-step]比较,并进行位置调换
#include <iostream>
using namespace std;
void Combsort(int data[],const int n, int way)
{
//升序排序
if (way == 0)
{
//初始化步长
int step = n, j, k;
//因子s=1.3用来确定元素的位置之间的间距(Box和Lacey1991)
//直至step/1.3<1时结束
while ((step = int(step / 1.3)) > 1)
{
//data[j]与data[j-step]比较,并进行位置调换
for (j = n - 1; j >= step; j--)
{
k = j - step;
if (data[j] < data[k])
{
int temp = data[j];
data[j] = data[k];
data[k] = temp;
}
}
}
//冒泡排序
bool change = true;
for (int i = 0; i < n - 1 && change; i++)
{
for (int j = n - 1, change = false; j > i; --j)
{
if (data[j] < data[j - 1])
{
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
change = true;
}
}
}
}
//降序排序
else if (way == 1)
{
int step = n, j, k;
while ((step = int(step / 1.3)) > 1)
{
for (j = n - 1; j >= step; j--)
{
k = j - step;
if (data[j] > data[k])
{
int temp = data[j];
data[j] = data[k];
data[k] = temp;
}
}
}
bool change = true;
for (int i = 0; i < n - 1 && change; i++)
{
for (int j = n - 1, change = false; j > i; --j)
{
if (data[j] > data[j - 1])
{
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
change = true;
}
}
}
}
}
int main()
{
//定义数组大小
const int Num = 20;
int Arr[Num] = { 92,57,42,69,89,16,24,44,52,11,73,9,45,3,64,29,87,26,78,31 };
cout << "排序前:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//升序排序
Combsort(Arr, Num, 0);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
//降序排序
Combsort(Arr, Num, 1);
cout << "排序后:";
for (int i = 0; i < Num; i++)
cout << Arr[i] << " ";
cout << endl;
system("pause");
return 0;
}
请在转载文章过程中明确标注文章出处!尊重原创,尊重知识产权,谢谢!