冒泡排序、插入排序、选择排序的总结
相同点
三者都是简单直观容易理解的排序算法。
三者都是通过比较完成排序的。
三者都是构造已排序序列,迭代元素个数次,且保证每次迭代前后已排序序列都是有序的。这样,迭代元素个数次后,排序即完成。
区别
区别在于每次迭代保持已排序序列有序的具体过程:
选择排序每次迭代从未排序序列中选出最大(小)值,放在已排序序列末端。
插入排序每次迭代把未排序序列首段元素插入到已排序序列的合适位置(即保证插入后已排序序列仍是有序的)。
冒泡排序每次迭代把未排序序列首段元素从已排序序列末端开始不断交换,直到已排序序列有序。
冒泡排序其实也属于选择排序
冒泡排序遍历未排序序列,一旦发现逆序对,便交换,这样,每次遍历,都能把未排序序列中的最大者浮动到末尾。
(对于基本有序的序列,插入排序快于任何排序(快速排序对基本有序序列效率反而低)。)
测试:
#include <stdio.h>
#include <stdlib.h>
void swap_my(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void select_sort(int *arrInput, int len)//从小到大排序
{
int mini;
for(int i=0;i<len;i++)
{
mini=i;
for(int j=i+1;j<len;j++)
if(arrInput[mini]>arrInput[j])
mini=j;
swap_my(&arrInput[i],&arrInput[mini]);
}
}
void bubble_sort(int * arrInput, int len)
{
for(int i=0;i<len;i++)
{
for(int j=i;j>=1;j--)
if(arrInput[j]<arrInput[j-1])
swap_my(&arrInput[j],&arrInput[j-1]);
else
break;
}
}
void insert_sort(int * arrInput, int len)
{
int temp;
for(int i=1;i<len;i++)
{
temp=arrInput[i];int j;
for(j=i-1;j>=0;j--)
{
if(temp>=arrInput[j])
{
break;
}
else
arrInput[j+1]=arrInput[j];
}
arrInput[j+1]=temp;
}
}
int main()
{
int len;
printf("输入数组长度:");
scanf("%d",&len);
int *arrNum=(int*)malloc(sizeof(int)*len);
for(int z=0;z<len;z++)
scanf("%d", &arrNum[z]);
insert_sort(arrNum, len);
for(int i=0;i<len;i++)
printf("%d ", arrNum[i]);
printf("\n");
insert_sort(arrNum, len);
for(int i=0;i<len;i++)
printf("%d ", arrNum[i]);
printf("\n");
insert_sort(arrNum, len);
for(int i=0;i<len;i++)
printf("%d ", arrNum[i]);
printf("\n");
return 0;
}
浙公网安备 33010602011771号