今天开始就写中级算法了,哈哈哈
这个星期小编主要围绕着排序问题来写算法
一共会写8个关于排序的算法
1.选择排序
2.插入排序
3.冒泡排序
4.快速排序
5.希尔排序
6.归并排序
7.基数排序
8.堆排序
就是以上列出的着八个算法,大概就是每天一个算法,8天就能讲完了
所以今天小编要讲的算法就是选择排序了,在讲选择排序之前,小编先给不懂的同学科普一下,到底什么是选择排序?
选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。
简单选择排序的基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
思路如下:
我们不断的去遍历数据,从交换过的数据的下一个位置开始遍历,先把下一个位置的数据记录下来,然后遍历后来的数据,如果发现更小的数据,就记录下来,直到遍历完后,我们再将最小的数据和开始记录的那个数据交换。
当我们遍历完所有的数据后,我们的数据就排好了
首先我们实现将第几趟的所有数据打印出来的功能:
void print(int a[], int n, int i)
{
//a[]数组为我们排序的数据,n是我们数据的长度,i代表了趟数,至于为什么是i+1后面就有解释
cout << "第" << i + 1 << "趟:";
for (int j = 0; j < n; j++)
{
cout << a[j] << ",";
}
cout << endl;
}
至此,我们就实现了打印数据的功能,接下来就是如何排序
排序我们拆成两个函数:
1.选择最小数据的函数SelectMinKey()
2.交换排序的函数selectSort()
先来实现选择最小的函数
分析:
需要遍历未排完序的数组
返回最小的数据的位置Key
int SelectMinKey(int a[], int n, int i)
{
int k = i;
for (int j = i + 1; j < n; ++j)
{
if (a[k] > a[j])
k = j;
}
return k;
}
在我们的参数列表,第一个表示了数据数组,n代表了需要的遍历的数据最大的长度,i表示了已经排完序的数据数量,然后我们从排完序的数据后一位开始遍历,寻找更小的数据,使用if判断,如果判断成立,有更加小的数字,我们就将数据进行记录,然后继续遍历选择,有没有比这个数据更加小的数据,最后将最小的数据返回
然后下一个函数就是要实现交换的
分析:
1.需要跑遍数据,排序完成需要的次数应该是数据的长度
2.实现数据的交换功能
void selectSort(int a[], int n)
{
int key, tmp;
for (int i = 0; i < n; ++i)
{
key = SelectMinKey(a, n, i);
if (key != i)
{
tmp = a[i];
a[i] = a[key];
a[key] = tmp;
}
print(a, n, i);
}
这个函数的参数,第一个是我们的数据数组,第二个为长度
再看函数体,函数顶部定义了两个数据,一个用来存储返回最小的数据的位置Key,另一个用于存储交换的数据tmp
我们使用SelectMinKey()函数,返回了最小数据的位置,然后判断,如果这个位置不是原本的循环开始的时候i的位置,那我们就可以认为,函数程序找到了更加小的数据,而且我们已经知道了更小数据的位置,所以我们去交换这两个数据就做到了排序,这样的一次循环,我们称之为一趟排序,因为我们每次排序都是只排好了一个数据,所以需要排数组的长度次。
#include <iostream>
using namespace std;
void print(int a[], int n, int i)
{
cout << "第" << i + 1 << "趟:";
for (int j = 0; j < n; j++)
{
cout << a[j] << ",";
}
cout << endl;
}
int SelectMinKey(int a[], int n, int i)
{
int k = i;
for (int j = i + 1; j < n; ++j)
{
if (a[k] > a[j])
k = j;
}
return k;
}
void selectSort(int a[], int n)
{
int key, tmp;
for (int i = 0; i < n; ++i)
{
key = SelectMinKey(a, n, i);
if (key != i)
{
tmp = a[i];
a[i] = a[key];
a[key] = tmp;
}
print(a, n, i);
}
}
int main()
{
int a[8] = { 3,1,5,7,2,4,9,6 };
cout << "初始值";
for (int j = 0; j < 8; j++)
{
cout << a[j] << ",";
}
cout << endl;
selectSort(a, 8);
print(a, 8, 8);
}
以上就是选择排序算法的全部代码,还有就是希望喜欢编程的同学能坚持的学习,学习之路漫长,小编与你们同行!
哈哈哈哈,今天的算法就到这里了,再见各位!
网友评论