关于选择排序,我们可以直接从名字来了解,就是先选择再排序,下面给出一组图来更直观图来帮助大家了解:
可以看出该种排序方案并没有跟冒泡排序一样边判断边排序,而是先通过选择,找出最小的数,然后再将最小的数排到前面,那么将剩下未排序的数组按照这种方式再次排序,就可以得到排序整齐的数组了,整体函数代码就是:
void quickly(int arr[],int size)
{
int i,j,a=0,temp;
for(j=0;j<size;j++)
{
for(i=1+i;i<size-1-j;i++)
{
if(arr[j]>arr[i])
{
a=i;
}
}
temp=arr[j];
arr[j]=arr[a];
arr[a]=temp;
}
}
这里解释一下第二次循环的j为什么要加i:
就是这个i代表已经排好的元素,此次循环要找的是未排序的元素的最小值。
接下来解释一下该次最小值是如何与该次循环的首值交换:
在每次找到此时最小值时,用变量a来记录该最小值的下标,最后找到该次循环的最小值,然后通过该下标来找到该元素,用中间变量来与该循环第一个值交换。
然后我们来讲一下插入排序,下面附上动图:
可以看出该数列排序并不是从未排序的数组中找到最大或者最小值,而是将数组分为两部分,一部分为已排序数组,一部分为未排序数组:
4 | 3 | 6 | 5 | 2 | 1 |
其中对第一个数字进行排序,因为此时已排序数组中没有元素,所以4直接就加入就相当于有序数组:
4 | 3 | 6 | 5 | 2 | 1 |
然后在下一个元素排序,下一个元素是3,不能直接排在4后面否则会使已排序好的数组变成乱序,所以此时3要插入到4的前头才能构成从小到大的有序数组,
3 | 4 | 6 | 5 | 2 | 1 |
那么此时对下一个元素排序,使前头的有序数组依旧按照从小到大的顺序排序:
3 | 4 | 6 | 5 | 2 | 1 |
接下来对下一个元素排列,5大于4小于6,所以此时插入到4和6之间:
3 | 4 | 5 | 6 | 2 | 1 |
依次类推最后得到一个按照从小到大排序的数组。
具体实现代码如下:
void cha(int arr[])
{
int i,j,size,temp;
size=sizeof(arr)/sizeof(arr[0]);
for(i=1;i<size-1;i++)
{
for(j=i-1;j>=0;j--)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}