选择排序(select sort):
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
如果在 C 语言中去实现选择排序,我们最常见的就是两层循环的实现方式。从选择排序的思想出发,我们都不难看出:
- 寻找最小的元素需要一层循环
- 逐个被选出也是需要一层循环的
N-S图如下:
算法如下:
for i = [0, n-2]
select min number from sortObjects after num[i]
if num[i] isnt the min number
swap the min number with num[i]
代码如下:
//选择排序
#include<stdio.h>
int main(){
int a[10];
int i=0,j,n=10,temp,max;
/*while(scanf("%d",&a[i])!=EOF){
scanf("%d",&a[i]);
i++;
n++;
}*/
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
max=i;
for(j=i+1;j<n;j++)
{
if(a[j]>a[max]){
max=j; //只保留下标
}
}
temp=a[i];
a[i]=a[max];
a[max]=temp;//将a[i+1]到a[10]中最大值与a[i]交换
}
for(i=0;i<n;i++){
printf("%d",a[i]);
if(i!=n-1){
printf(" ");
}
}
printf("\n");
return 0;
}
冒泡排序(bubble sort):
冒泡排序的基本思想是将数组中的每个相邻元素进行两两比较,按照小元素在前(或大元素在前)的原则确定是否进行交换。这样每一轮执行之后,最大(或最小)的元素就会被交换到了最后一位。
完成一轮之后,我们可以再从头进行第二轮的比较,直到倒数第二位(因为最后一位已经是被排序好的了)时结束。这样一轮之后,第二大(或第二小)的元素就会被交换到了倒数第二位。
同样的过程会依次进行,直到所有元素都被排列成预期的顺序为止。这个过程是不是很像是水中的起泡一个个冒起来的过程.
算法如下:
do
swaped = false
for i = 1 to indexOfLastUnsortedElement
if leftElement > rightElement
swap(leftElement, rightElement)
swapped = true
while swapped
如果在 C 语言中去实现冒泡排序,我们最常见的就是两层for循环的实现方式。
如果我们有 5个数待排序,我们可以会在程序中写出这样的片段:
for(j=0;j<5;j++){
for(i=0;i<4-j;i++){
swap(a[i],a[i+1];
}
}
i和j都是用于作为数组索引的变量,swap是一个交换值的函数.
那么有没有发现两种排序方式的区别呢?
区别主要在交换的方式上
每一轮都把最大或最小的元素筛选出来放在相应的位置上
这是相同的
但是
对于每一轮
比如第一轮
要把1~n 中最大的那个放到n这个位置
冒泡法每次比较和移动相邻的两项
而选择排序每次交换当前项和第n项
我把代码写出来你就懂了:
冒泡:
for i:=1 to n-1 do
if (a[i]>a[i+1]) then swap(i,i+1);
选择:
for i:=1 to n-1 do
if (a[i]>a[n]) then swap(i,n);
(swap 表示交换)
总的来说,两种排序比较的次数是相同的
但交换的次数,选择排序是更少的
虽然两者的时间复杂度都是 O(n^2)
但通常,选择排序更快一点
冒泡排序是每一次都可能要交换
而选择排序是在比较时记下a[i]的位置 最后来交换
所以他们的交换过程是不一样的 而查找的过程是一样的
效率不会比冒泡的低…