这是我参加“朝闻道”知识分享大赛的第一篇文章。
在数据结构中令我们头疼的排序问题是否有简便的方法来帮我们记忆呢?
这里分享我的一点小技巧,可能有不太正确的地方或者你有更好的方法,欢迎评论区留言!!!
目录
接下来的排序中可能会多次用到交换的函数,我们先给出相应代码。
void swap(&i,&j)
{
int &temp;
&temp=&i;
&i=&j;
&j=&temp;
}
-
一.冒泡排序
首先我们可以这样想,冒泡就是把最大,次大,次次大的数一个个冒出来。
第一步,我们可以先找到最大的数。一般来说我们怎样进行一排数的比较的大小呢?我们会想到先将两个数进行比较,再拿这个数与另一个数进行比较,直到找到最大的数为止。冒泡排序也是利用了这种方法。
先一一将两个数进行比较,比较到最后两个时我们就可以找出最大数啦!找到了最大的数,次大的数我们是不是也可以用这种方法找到呢?
当然!
- 实现:假设数组的长度为length,一次比较找出比较中最大的数,将数组中所有的数进行排序我们便需要进行length次比较。每次都是这个数与后一个数进行比较,如果前面一个比较大就与后一个数进行交换,否则不用交换。
void bubble_sort(int arr[],int length)
{
int swappped=0;
for(int i=0;i<=length-1;i++)
{
for(int j=0;j<=length-1;j++)
{
if(arr[j-1]>a[j])
{
swap(arr[j],arr[j-1]);
swapped=1;
}
}
if(!swapped)
break;
}
}
-
二.插入排序
插入排序我们可以想象成在一副扑克牌中插入我们所摸到的牌。
假设我们已经摸到了五张牌并且排好了位置,当我们再摸到一张牌时,我们需要按照顺序放纸牌。我们可以从最大的牌开始比较,直到找到比这张牌小的第一张纸牌,我们便可以将其放在这张纸牌的后面,保证摸到的纸牌前面的纸牌比他小,后面的纸牌比他大。
- 实现:我们可以从摸到的第二张牌开始这样比较,一共需要比较length-1轮。每一次比较都是从大到小比较,比较的条件是到最后一张牌为止,并且摸到的牌都比前面的牌大。
void insertion(int arr[],int length)
{
int i,j,key;
for(int i=1;i<lengh;i++)
{
key=arr[i];
while(j>0&&arr[j]>key)
{
arr[j+1]=a[j];
j--;
}
arr[j+1]=key;
}
}
-
三.选择排序
选择排序是指选择一个数假定为最大或者最小的数,然后进行比较,直到找到了比假定数小(或者大)的数。
- 实现:(这里以最小的数为例子)然后一个一个与后面的数进行比较,如果这个遇到比这个数小的数则设定这个数为最小数。扫到最后一位数时,最小的数也就是这一排数中最小的数。将这个最小的数与这一排数的第一个数调换位置,那么这一排数的第一个就是这一排数中最小的数。
- 以此类推,可以找出次小,次次小的数。一共需要找length次。
void selection(int arr[],int length)
{
int i,j,min;
for(int i=0;i<lengh;i++)
{
min=i;
for(int j=i+1;j<length;j++)
{
if(arr[j]<arr[min])// 注意,这里是和最小的数进行比较
{
min=j;
}
}
swap(&arr[min],&arr[i]);
}
}
-
四.快速排序
快速排序是排序中非常重要的一种排序,那他的快速体现在哪里呢?
这里会用到分治的思想,把大的问题分解成小的问题,把小的问题解决后,把他们的答案合并起来。
首先,我们会选择一个基准,这里我们选择最后一位数,总体的思想就是把比基准小的数放在基准的前面,把比基准大的数放在基准的后面。
- 实现:我们需要选择三个数,一个是基准数,一个是比较小的数,一个是当前扫描的数。我们把基准数设置为一排中的最后一个数,较小的数设置为第一个数。扫描的数从第一个数开始,
- 如果这个数比基准数小就用这个数和较小数进行交换,然后较小数向前挪一个位置。一轮扫描完成后将基准数与较小数进行交换。这就完后了一个基本的划分。
- 然后进行递归。递归是什么意思呢,这里有篇递归文章可以解释。
void qsort(int arr[],int low,int high)
{
if(low<high)
{
int mid=partition(arr,low,high);
qsort(arr,low,mid-1);
qsort(arr,mid+1,high);
}
}
void partition(int arr[],int low,int high)//目标位置为最右边
{
int pivot=arr[high];
int i=low;
for(int j=low;j<high;j++)//比pivot小的数全部换到前面去。
{
if(arr[j]<pivot)
{
swap(&arr[j],&arr[i++]);
}
}
swap(&arr[i],&arr[high]);
return i;
}