1. 程式人生 > >【排序演算法4】選擇排序

【排序演算法4】選擇排序

選擇排序的思想比較簡單。

每趟都記錄下當前序列中最小元素的下標,並將該下標與當前序列起始下標交換內容。每趟都減少序列一個已排好序的元素。

這裡依舊感謝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;
}