版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/sinat_29648453/article/details/84679215
选择排序的思想比较简单。
每趟都记录下当前序列中最小元素的下标,并将该下标与当前序列起始下标交换内容。每趟都减少序列一个已排好序的元素。
这里依旧感谢MoreWindows的博客插入排序
这里还有对Swap函数实现的几种方式和数学证明。bitset用于二进制式的显示数据。
但是我算法比较倾向于用纯C的方式写,所以Swap还是用的指针形式
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <bitset>
using namespace std;
void Swap(int *,int *);
void Swap1(int &,int &);
void Swap2(int &,int &);
void Swap3(int &,int &);
void select_sort(int a[],int n)
{
int i,j, nMinIndex;
for( i = 0 ; i < n ; ++i )
{
nMinIndex = i;
for(j = i + 1 ; j < n ; ++j )
{
if( a[j] < a[nMinIndex] )
{
nMinIndex = j;
}
}
Swap(&a[i],&a[nMinIndex]);
}
}
void Swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void Swap1(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
void Swap2(int &a,int &b)
{
/*
a ^= b : a = a^b
b ^= a : b = b^(a^b) = a^(b^b) = a ^ 0 = a
a ^= b : a = (a^b)^a = a^a^b = 0^b = b
有前提条件:a b不是同一个元素
如果是同一个元素
a ^= b : a = a ^ a = 0;
b ^= a : b = b ^ b = 0;
a ^= b : a = b ^ b = 0;
*/
if( a != b)
{
//cout<<"binary of a: "<<bitset<sizeof(int)*8>(a)<<endl;
//cout<<"binary of b: "<<bitset<sizeof(int)*8>(b)<<endl;
a ^= b;
//cout<<bitset<sizeof(int)*8>(a)<<endl;
b ^= a;
//cout<<bitset<sizeof(int)*8>(b)<<endl;
a ^= b;
//cout<<bitset<sizeof(int)*8>(a)<<endl;
}
}
void Swap3(int &a,int &b)
{
/*
a = a + b
b = a - b : b = a + b - b = a;
a = a - b : a = a + b - a = b
有一个前提条件:a b不是同一个元素
如果是同一个元素
b = a - b : b = b - b = 0;
a = a - b : a = a - a = 0;
*/
if( a != b )
{
a = a + b;
b = a - b;
a = a - b;
}
}
void print(int a[],int n)
{
for(int i = 0 ; i < n ; ++i )
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
select_sort(a,10);
print(a,10);
int c = 5;
int d = 10;
Swap3(c,c);
printf("%d %d\n",c,d);
system("pause");
return 0;
}