選擇排序

選擇排序描述

       選擇排序開始的時候,掃描整個列表,找到它的最小元素然後和第一個元素交換,將最小元素放到它在有序表中的最終位置上。然後我們從第二個元素開始掃描列表,找到最後n-1個元素中的最小元素,再和第二個元素交換位置,把第二小的元素放到它在有序表中的最終位置上。一般來說,在對該列表做第 i 遍掃描的時候(i 的值從0到n-2),該算法在最後n-1個元素中尋找最小元素,然後拿它和A[i]交換:

                                                                         

       在n-1遍以後,該列表就被排好序了。



       算法:

SelectionSort(A[0...n-1])
 //該算法用選擇排序對給定的數組排序
 //輸入:一個可排序的數組A[0...n-1]
 //輸出:非降序排列的數組A[0...n-1]
 for i <- 0 to i <- n-2 do 
    min <- i
	for j <- i+1 to j <- n-1 do 
       if A[j] < A[min] min <- j
    swap A[i] and A[min]


選擇排序的實現

// SelectionSort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "typedef.h"

/*
*函數名:Compare_uint
*參數:pKey1  指向第一個比較元素的地址
*      pKey2  指向第二個比較元素的地址
*功能:比較兩個元素的大小
*返回值:1 表示Key1 大於 Key2
*        -1 表示Key1 小於 Key2
*        0 表示Key1 等於 Key2
*作者:AlbertoNo1
*日期:2016-03-15
*/
INT32 Compare_uint(VOID *pKey1, VOID *pKey2)
{
	/*對兩個無符號整型數進行比較*/
	if (*((UINT32*)pKey1) > *((UINT32*)pKey2))
	{
		return 1;
	}
	else if (*((UINT32*)pKey1) < *((UINT32*)pKey2))
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

/*
*函數名:Swap
*參數:pKey1  指向第一個交換元素的地址
*      pKey2  指向第二個交換元素的地址
*      uiKeySize 交換元素所佔內存大小(Byte)
*功能:交換兩個元素的位置
*返回值:無
*作者:AlbertoNo1
*日期:2016-03-15
*/
VOID Swap(VOID *pKey1, VOID *pKey2, UINT32 uiKeySize)
{
	VOID *pTemp = NULL;

	if (NULL == (pTemp = malloc(uiKeySize)))
	{
		return;
	}

	memcpy(pTemp, pKey1, uiKeySize);
	memcpy(pKey1, pKey2, uiKeySize);
	memcpy(pKey2, pTemp, uiKeySize);
}


/*
*函數名:SelectionSort
*參數:pData  待排序數組數據的首地址
*      uiSize 數據的元素個數
*      uiElmSize  數據元素所佔內存大小(Byte)
*      compare  兩個元素的比較函數
*功能:對數組進行選擇排序
*返回值:無
*作者:AlbertoNo1
*日期:2016-03-21
*/
VOID SelectionSort(VOID *pData, UINT32 uiSize, UINT32 uiElmSize, INT32 (*compare)(VOID *pKey1, VOID *pKey2))
{
	UINT32 i = 0;
	UINT32 j = 0;
	UINT32 uiSwitchPos = 0;  /*存儲一輪比較最終要交換的位置*/

	CHAR *pucData = NULL;

	if (uiSize <= 1)
	{/*不用排序*/
		return ;
	}

	pucData = (CHAR*)pData;

	for (i = 0; i < uiSize -1; i++)
	{/*進過 uiSzie-1 輪比較後,排序完成*/
		uiSwitchPos = i;

		for (j = i+1; j < uiSize; j++)
		{
			if (compare(&pucData[j*uiElmSize], &pucData[uiSwitchPos*uiElmSize])<0)
			{
				uiSwitchPos = j;
			}
		}

		if (i != uiSwitchPos)
		{
			Swap(&pucData[i*uiElmSize], &pucData[uiSwitchPos*uiElmSize], uiElmSize);
		}
	}

	return ;
}


int _tmain(int argc, _TCHAR* argv[])
{
	INT32 iRet = 0;
	UINT32 uiLoop = 0;

	//UINT32 auiData[] = {10,15,15,18,20,20,20,36,48,51,51,77,77};
	//UINT32 auiData[] = {77,77,51,51,48,36,20,20,20,18,15,15,10};
	UINT32 auiData[] = {77,15,20,18,51,51,36,10,77,15,20,20,48};
	//UINT32 auiData[] = {77,77};
	//UINT32 auiData[] = {77};

	SelectionSort(auiData, sizeof(auiData)/sizeof(auiData[0]), sizeof(auiData[0]),Compare_uint);

	printf("Selection Sort Success.\n");
	printf("Result:\n");

	for (uiLoop = 0; uiLoop < sizeof(auiData)/sizeof(auiData[0]); uiLoop++)
	{
		printf("%d  ", auiData[uiLoop]);
	}

	getchar();
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章