void Swap(int *ap,int *bp)
{
int tmp=*ap;
*ap=*bp;
*bp=tmp;
}//模块化
**
1 选择排序
**
(遍历N-1次,每次找出数组的最小值与前面的数交换实现有序)
void SelectSort(int *a,int n)
{
// if 与for的结合
int temp;
for (int i = 0; i <n-1; i++)//每次选出第i小,最后一位不用选,已经是了
{
int k = i;//k作为最小值下标保存
for (int j = i + 1; j < n; j++)//找出每次遍历的最小值
{
if (a[k] > a[j])// k和j比较,找出最小值
{
k = j;//保证k保存的是此次遍历的最小值
}
}
if(k!=i)
{
Swap(&a[k],&a[i])
}
}
}
}
ps:在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
**
2 插入排序(扑克牌接牌)
**
(逐步构造出有序,找到造成不有序的值,和前面的值比较,若小于前面的值后移空出位来,直至大于前面的数插入)
void insert_sort(int *a,int n)
{
int tmp;
int j;
for (int i = 1; i < n; i++)//1 有序
{
if (a[i] < a[i - 1])
{
tmp = a[i];//还要比较前面的数是否小于它,保存插入数
j = i - 1;
do//前面判断过i与i-1
{
a[j+1] = a[j ];//将大于它的值后移,空出位子来让它插入
j--;
} while (j>=0&&a[j]>tmp);
a[j+1] = tmp;//此时插入j的位置使得有序
}
}
}
std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};
std::cout << "before sort: ";
for (int n: v)
std::cout << n << ' ';
std::cout << '\n';
// 插入排序
for (auto i = v.begin(); i != v.end(); ++i) {
std::rotate(std::upper_bound(v.begin(), i, *i), i, i+1);
}
std::cout << "after sort: ";
for (int n: v)
std::cout << n << ' ';
std::cout << '\n';
3 冒泡
void Bubble_sort()
{
bool tag = true;
for(int i=0;i<n-1;i++) //只有最后一位不用比较
{
for (int j = 0; j < n-1-i; j++)//每次将最大的值放在最后
{
if (a[j] > a[j + 1])//两两比较
{
Swap(&a[j],&a[j + 1]);
tag = false;//是否有序
}
}
//已经有序不用交换了
if (tag)
{
break;
}
}
}