老铁们,今天我们来聊一聊选择排序和插入排序 ,其实这两种排序的时间复杂度和冒泡排序是一样的 ,都是 O(N^2) ,三者的区别只是比较元素的顺序不同而已 。
一、选择排序
原理:从数组中找到最小的元素 与第一个元素替换。再从第二个元素开始找到最小的元素和第二个元素替换,以此类推,到 N-1个元素位置,来上码吧。
void selectsort()
{
int arr[] = {8, 21, 563, 63, 456, 5, 70, 2, 4, 76, 54, 2, 1, 3};
int len = sizeof(arr) / sizeof(arr[0]);
printf("选择排序 -->前的数组:");
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
printf("\n");
printf("长度--->%d \n", len);
int minindex;
for (int i = 0; i < len; i++)
{
minindex = i;
for (int j = (i + 1); j < len; j++)
{
if (arr[minindex] > arr[j])
{
minindex = j;
}
}
if (arr[i] != arr[minindex])
{
arr[i] = arr[i] ^arr[minindex];
arr[minindex] = arr[i] ^arr[minindex];
arr[i] = arr[i] ^arr[minindex];
}
}
printf("选择排序后的数组:");
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
}
运行的结果:
二、插入排序
原理:从第二个元素开始跟前面的元素比较,然后放适合的位置,前两个元素比较好后,第三个元素跟前面两个比较,再放到合适的位置, 我盗一张图给大伙看看,
相对前面两种排序 是不是优雅了许多,不过时间复杂度都是一样的。
来上码!
void Insertionsort()
{
int arr[] = {8, 21, 563, 63, 456, 5, 70, 2, 4, 76, 54, 2, 1, 3};
int len = sizeof(arr) / sizeof(arr[0]);
printf("插入排序 -->前的数组:");
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
printf("\n");
printf("长度--->%d \n", len);
for (int i = 1; i <= len; i++)
{
int current = arr[i];
int currentindex = i - 1;
while (arr[currentindex] > current && currentindex >= 0)
{
arr[currentindex + 1] = arr[currentindex];
if (arr[currentindex - 1] <= current || current == 0)
{
arr[currentindex] = current;
}
currentindex--;
}
}
printf("插入排序后的数组:");
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
}
大伙自己比较一下两个排序的区别,后面我们在总结一下 所有排序的优缺点。今天分享到这里,如有不对,请大家多多指教,欢迎留言 一起切磋技术问题, 上班去咯。。。