排序算法——选择排序

一、简单选择排序算法的思想很简单,在待排序的数组中,选择最大(或者最小的)与第一个元素进行交换,然后在剩下的元素中选择次大的(次小的)与第二个元素进行交换,以此类推,直到最后两个元素比较完成。感觉思想很简单很简单,是我认为所以排序算法里,最好理解的算法,但是就这个程序,居然写了一个小时没写出来,我真的是服了自己,可能是自己现在脑子有点晕,也有可能是真的就是因为自己太菜了,总之,上代码了,真的是要多动手,也要多思考,有想法快点写出来才是真啊,否则思想只是思想而已……

#include<iostream>
#include<iomanip>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>
using namespace std;

void SelectionSort(int array[], int n);
void swap(int array[], int size, int x, int y);

void shell_sort(int a[], int arraylength, int n);
int main()
{
	int t_array[] = { 70, 30, 40, 10, 80, 20, 90, 100, 75, 60, 45 };	
	int size_tarray = sizeof(t_array)/sizeof(int);
	SelectionSort(t_array, size_tarray);
	for (int i = 0; i < size_tarray; i++)
	{
		cout << t_array[i]<<endl;
	}
	return 0;
}

void SelectionSort(int array[], int n)//排序算法,将数组作为参数进行传递时,要同时传它的长度。也可以学习用指针或引用的方式操作它呢,刚刚学习C++,暂时还不太会呢
{
	for (int i = 0; i < n; i++)
	{
		int smallest = i;//这里我之前上来就取数据了,其实应该是取下标
		for (int j = i+1; j <n; j++)
		{			
			if (array[j]<array[smallest])//这里要很注意,我觉得自己没写出来,最重要一步就是这里卡住了,比较的是数,但是传入和交换的是下标
			{
				smallest = j;//用一个整型数记录最小的数对应的下标,而不是记录这个数,这一点很重要
			}				
		}
		swap(array,n,smallest,i);//最后是通过交换函数,根据下标作为参数,将其实现的
	}
}

void swap(int array[],int size,int x, int y)
{
	int temp;
	temp = array[x];
	array[x]= array[y];
	array[y] = temp;
}

二、二元选择排序算法

在上面简单的选择排序算法基础上有所改进,在一次比较过程中,同时记录最大值和最小值,分别于两端进行交换,重复此过程。下面是代码:

void BinarySelectionSort(int array[], int n);
void swap(int array[], int size, int x, int y);

int main()
{
	int t_array[] = { 70, 30, 40, 100, 80, 20, 90, 100, 75, 60, 45 };	
	int size_tarray = sizeof(t_array)/sizeof(int);
	BinarySelectionSort(t_array, size_tarray);
	for (int i = 0; i < size_tarray; i++)
	{
		cout << t_array[i]<<endl;
	}
	return 0;
}

void swap(int array[], int size, int x, int y)
{
	int temp;
	temp = array[x];
	array[x] = array[y];
	array[y] = temp;
}

void BinarySelectionSort(int array[], int n)
{
	for (int i = 0; i < n / 2; i++)
	{
		int min = i;
		int max = n - i - 1;
		for (int j = i + 1; j <n - 1 - i; j++)
		{
			if (array[j]<array[min])
			{
				min = j;						
			}
			if (array[j]>array[max])
			{
				max = j;
			}
		}
		swap(array, n, min, i);
		swap(array, n, max, n - i-1);
	}
}
不过这段代码,对于大部分数组均可以实现排序,但对于上面举例的这个数组,无法实现数组{ 700, 30, 40, 100, 80, 20, 90, 100, 75, 60, 45 }的正确排序,应该考虑情况不够全面造成的,求指教啊!自己往后也要再思考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值