您的位置:首页 > 理论基础 > 数据结构算法

数据结构 - 选择排序

2013-06-13 17:05 225 查看
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
以此类推,直到所有元素均排序完毕

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。O(n*n)

#include <stdio.h>

void SelectSort(int a[], int n)
{
int i, j, min;
//i从0到n-2(倒数第二个数)
for (i = 0; i < n - 1; i++)
{
//默认第一个为最小值
min = i;
for (j = i + 1; j < n; j++)
{
//找到最小值,标记为min(结果为递增排序)
//若要递减排序,可改为: a[min] < a[j]
if (a[min] > a[j])
min = j;
}
//如果最小值即为当前第一个数,则无须交换;否则交换
if (min != i)
{
int t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}

int main()
{
//int a[] = {31, 41, 59, 26, 53, 58, 97};
int a[] = {7, 1, 0, 0, 3, 0, 6, 6, 3};
SelectSort(a, sizeof(a) / sizeof(*a));
for (int i = 0; i < sizeof(a) / sizeof(*a); i++)
printf("%d\t", a[i]);
printf("\n");

return 0;
}


//递归写法

笔试碰到,时间不够,写了个非递归的,面试时,非让写个递归的出来,结果一紧张,没弄出来。。。

好好反省一下:。。。。。。。

sort(int a[], int n),函数已给定,先说了一个递归的,不过加了一个参数,面试官说不行。囧。。。

想了半天,居然昏了头了。。。。。。

思想:由于函数给定,递归只能改变n,所以得从后往前,先确定最大的一个数。然后在来确定倒数第二个大的数,知道最后。

结束条件是只剩下一个数,排序结束。

#include<iostream>
using namespace std;

void RSort(int A[], int n)
{
if(n==1)//结束条件
return;
for(int i = 0; i < n; i++)
{//找最大的数,放到最后
if(A[i]>A[n-1])
{
int t = A[i];
A[i] = A[n-1];
A[n-1] = t;
}
}
RSort(A,n-1);//递归调用,
}

int main()
{
int a[] = {4,5,7,2,8,1};
RSort(a, 6);
for (int i = 0; i < 6; i++)
cout << a[i] << ' ';
cout << endl;

return 0;
}

//难吗?看来心理素质还不行!!!一紧张就全乱套了。。。

反省。期待二面通知。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: