当前位置:首页 » 操作系统 » 选择排序算法

选择排序算法

发布时间: 2022-02-07 06:41:30

‘壹’ c语言选择法排序

#include<stdio.h>

#defineM 5

void main()

{

int b[M],i,j,t,k;

for(i=0;i<M;i++)

scanf("%d",&b[i]);

for(i=0;i<M-1;i++)

{

for(k=i,j=i+1;j<M;j++)

if(b[k]<b[j])

k=j;

if(i!=k)

{

t=b[i];

b[i]=b[k];

b[k]=t;

}

}

for(i=0;i<M;i++)

printf("%d ",b[i]);

}

错在大括号位置加错了。

代码:

#include<stdio.h>

void SelectionSort(int *num,int n)

{

int i = 0;

int min = 0;

int j = 0;

int tmp = 0;

for(i = 0;i < n-1;i++)

{

min = i;//每次讲min置成无序组起始位置元素下标

for(j = i;j < n;j++)//遍历无序组,找到最小元素。

{

if(num[min]>num[j])

{

min = j;

}

}

if(min != i)//如果最小元素不是无序组起始位置元素,则与起始元素交换位置

{

tmp = num[min];

num[min] = num[i];

num[i] = tmp;

}

}

}

(此处空一行)

int main()

{

int num[6] = {5,4,3,2,9,1};

int i = 0;

SelectionSort(num,6);//这里需要将数列元素个数传入。有心者可用sizeof在函数内求得元素个数。

for(i = 0;i < 6;i++)

{

printf("%d ",num[i]);

}

return 0;

}

‘贰’ 选择排序法

这是冒泡法吧

粘些资料给你:
冒泡排序和选择排序是排序算法中比较简单和容易实现的算法。冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。而选择排序的思想也很直观:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。
还有“
http://www.d2school.com/bcyl/bhcpp/newls/ls18.htm#18.2
还有
一、简单排序算法
由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境
下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么
问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。

1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:
#include

void BubbleSort(int* pData,int Count)
{
int iTemp;
for(int i=1;i {
for(int j=Count-1;j>=i;j--)
{
if(pData[j] {
iTemp = pData[j-1];
pData[j-1] = pData[j];
pData[j] = iTemp;
}
}
}
}

void main()
{
int data[] = {10,9,8,7,6,5,4};
BubbleSort(data,7);
for (int i=0;i<7;i++)
cout<}

倒序(最糟情况)
第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次

其他:
第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:3次

上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,
显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。
写成公式就是1/2*(n-1)*n。
现在注意,我们给出O方法的定义:

若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没
学好数学呀,对于编程数学是非常重要的!!!)

现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)
=O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。
再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的原因,我们通常都是通过循环次数来对比算法。

2.选择法:
现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下)这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中选择最小的与第二个交换,这样往复下去。
#include
void SelectSort(int* pData,int Count)
{
int iTemp;
int iPos;
for(int i=0;i {
iTemp = pData[i];
iPos = i;
for(int j=i+1;j {
if(pData[j] {
iTemp = pData[j];
iPos = j;
}
}
pData[iPos] = pData[i];
pData[i] = iTemp;
}
}

void main()
{
int data[] = {10,9,8,7,6,5,4};
SelectSort(data,7);
for (int i=0;i<7;i++)
cout<}
倒序(最糟情况)
第一轮:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交换1次)
第二轮:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交换1次)
第一轮:7,8,9,10->(iTemp=9)7,8,9,10(交换0次)
循环次数:6次
交换次数:2次

其他:
第一轮:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次)
第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次)
第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次)
循环次数:6次
交换次数:3次
遗憾的是算法需要的循环次数依然是1/2*(n-1)*n。所以算法复杂度为O(n*n)。
我们来看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以f(n)<=n
所以我们有f(n)=O(n)。所以,在数据较乱的时候,可以减少一定的交换次数。
最终,我个人认为,在简单排序算法中,选择法是最好的。
还有:http://it2.chinahw.net/ioi/Article/program/suanfa/200604/139.html

‘叁’ 直接选择排序算法问题

加不加都一样,加这个语句,上面的for循环后R[m]是最小的了,如果R[i]不是最小的, 即m!=i,所以要交换,交换后R[i]最小,如果R[i]本是最小的,通过if(m!=i) 语句可以不执行直接执行下面的语句,不执行交换的

‘肆’ 选择排序算法的思想是什么

次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的着作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的,我们可用C++描述如下:

template<class Type>

int BinarySearch(Type a[],const Type& x,int n)

{

int left=0;

int right=n-1;

while(left<=right){

int middle=(left+right)/2;

if (x==a[middle]) return middle;

if (x>a[middle]) left=middle+1;

else right=middle-1;

}

return -1;

}

模板函数BinarySearch在a[0]<=a[1]<=...<=a[n-1]共n个升序排列的元素中搜索x,找到x时返回其在数组中的位置,否则返回-1。容易看出,每执行一次while循环,待搜索数组的大小减少一半,因此整个算法在最坏情况下的时间复杂度为O(log n)。在数据量很大的时候,它的线性查找在时间复杂度上的优劣一目了然。
选择排序
基本思想是:每次选出第i小的记录,放在第i个位置(i的起点是0,按此说法,第0小的记录实际上就是最小的,有点别扭,不管这么多了)。当i=N-1时就排完了。

直接选择排序
直选排序简单的再现了选择排序的基本思想,第一次寻找最小元素的代价是O(n),如果不做某种特殊处理,每次都使用最简单的寻找方法,自然的整个排序的时间复杂度就是O(n2)了。

冒泡法
为了在a[1]中得到最大值,我们将a[1]与它后面的元素a[2],a[3],...,a[10]进行比较。首先比较a[1]与a[2],如果a[1]<a[2],则将a[1]与a[2]交换,否则不交换。这样在a[1]中得到的是a[1]与a[2]中的大数。然后将a[1]与a[3]比较,如果a[1]<a[3],则将a[1]与a[3]交换,否则不交换。这样在a[1]中得到的是a[1],a[2],a[3]中的最大值,...。如此继续,最后a[1]与a[10]比较,如果a[1]<a[10],则将a[1]与a[10]交换,否则不交换。这样在a[1]中得到的数就是数组a的最大值(一共进行了9次比较)。

为了在a[2]中得到次大值,应将a[2]与它后面的元素a[3],a[4],...,a[10]进行比较。这样经过8次比较,在a[2]是将得到次大值。

如此继续,直到最后a[9]与a[10]比较,将大数放于a[9],小数放于a[10],全部排序到此结束。
从上面可以看出,对于10个数,需进行9趟比较,每一趟的比较次数是不一样的。第一趟需比较9次,第二趟比较8次,...,最后一趟比较1次。

以上数组元素的排序,用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素,第一个元素与外循环i有关的,用a[i]标识,第二个元素是与内循环j有关的,用a[j]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为i+1,i+2,...。

‘伍’ 选择排序算法与冒泡排序算法有何异同啊

区别在于:在交换的方式上

冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。

而选择排序算法的改进在于:先并不急于调换位置,先从A[1]开始逐个检查,看哪个数最小就记下该数所在的位置P,等一躺扫描完毕,再把A[P]和A[1]对调,这时A[1]到A[10]中最小的数据就换到了最前面的位置。

所以,选择排序每扫描一遍数组,只需要一次真正的交换,而冒泡可能需要很多次。比较的次数一样的。

例如:1 2 3 4我们分别用a[0],a[1],a[2],a[3]存储。假设从大到小排序

选择排序,是a[0]和a[1],a[2],a[3]依次比较,遇到小的就交换,这样一次下来,最大的被保存在了a[0].下次排序就从a[1]开始重复以上步骤。

冒泡排序,是a[0]和a[1]比较,小的就交换。然后a[1]和a[2]比较,小的交换。然后a[2]和a[3]比较小的就交换。这样一次下来,最大的被保存在a[0]。下次排序从a[1]开始重复以上步骤。

虽然差不多,但是请注意:两者的比较方法是右差别的,一个事依次比下来,一个是俩俩比较。

(5)选择排序算法扩展阅读:

冒泡排序的基本思想是将数组中的每个相邻元素进行两两比较,按照小元素在前(或大元素在前)的原则确定是否进行交换。这样每一轮执行之后,最大(或最小)的元素就会被交换到了最后一位。

同样的过程会依次进行,直到所有元素都被排列成预期的顺序为止。这个过程是不是很像是水中的起泡一个个冒起来的过程.

选择排序(select sort):每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

‘陆’ 选择排序算法的思想是什么

选择排序=选择最小放前面

‘柒’ VB 关于选择排序算法

'在窗体上增加控件command1,label1,然后复制以下代码

Option Explicit
Dim a(9) As Long
Private Sub Command1_Click()
Dim i As Long, l As Long, n As Long
Dim j As Long, s As String
For i = 0 To 9 '使用选择排序法排序,每次选择最小的数值。
For l = i To 9
If a(i) > a(l) Then
n = a(i)
a(i) = a(l)
a(l) = n
End If
Next l
Print a(i)
s = ""
For j = 0 To 9
s = s & a(j) & vbNewLine
Next
MsgBox s, vbInformation, "阶段排序情况"
Next i
End Sub
Private Sub Form_Load()
a(0) = 564 '给数组a中个数组元素赋值。
a(1) = 78
a(2) = 45
a(3) = 456412
a(4) = 456
a(5) = 1
a(6) = 45 + 79
a(7) = 12
a(8) = 1 * 966
a(9) = 65 / 5
Dim i As Long
For i = 0 To 9
Label1.Caption = Label1.Caption & "第" & CStr(i + 1) & "是:" & CStr(a(i)) & " "
Next i
End Sub

‘捌’ 求 c语言选择排序法和 冒泡排序法代码!

选择排序:

void select_sort(int a[],int n) //传入数组的要排序的元素个数

{int i,j,min,t;

for(i=0;i<n-1;i++)

{ min=i; //min:当前最小值下标

for(j=i+1;j<n;j++) //扫描余下的部分

if(a[min]>a[j]) //若有其它元素更小,就记录其下标

min=j;

if(min!=i) //保若最小值不在排序区首位,就换到首位

{t=a[min]; a[min]=a[i]; a[i]=t;}

}

}

冒泡排序:

void bubble_sort(int a[], int n) //传入数组的要排序的元素个数

{ int i, j, t;

for (j=0; j<n-1; j++) //n个元素比较n-1轮

for (i= 0; i<n-1-j;i++) //比较相信的两个数

if(a[i]>a[i+1]) //若大小顺序不符,就交换

{t=a[i]; a[i]=a[i+1]; a[i+1]=t;

}

‘玖’ 选择排序算法

#include<stdio.h>
int main(){
int n,k,i,j,m;
int a[100];

scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
k=a[j];
a[j]=a[i];
a[i]=k;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}

return 1;
}

热点内容
跳转页源码 发布:2024-09-17 03:13:05 浏览:542
html文件上传表单 发布:2024-09-17 03:08:02 浏览:783
聊天软件编程 发布:2024-09-17 03:00:07 浏览:725
linuxoracle安装路径 发布:2024-09-17 01:57:29 浏览:688
两个安卓手机照片怎么同步 发布:2024-09-17 01:51:53 浏览:207
cf编译后没有黑框跳出来 发布:2024-09-17 01:46:54 浏览:249
安卓怎么禁用应用读取列表 发布:2024-09-17 01:46:45 浏览:524
win10设密码在哪里 发布:2024-09-17 01:33:32 浏览:662
情逢敌手迅雷下载ftp 发布:2024-09-17 01:32:35 浏览:337
安卓如何让软件按照步骤自动运行 发布:2024-09-17 01:28:27 浏览:197