冒泡排序和选择排序是最基本的排序方式,要掌握。
冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
选择排序每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。冒泡排序和选择排序定义来自百度百科。
举个例子来说明,相信大家都军训过,没军训过的也排队过。以军训来说,在一开始的报道的时候,大家排成一排时,是参差不齐,高矮掺杂,教官看了这个心情肯定很不爽要求你们从低到高排列。
冒泡排序:从第一个人开始比较,no1和no2比较,如果no1比no2高,那么两个人交换顺序,知道最后一个,最高的肯定在最后面了,这时候重新从第一个人开始比较,直到倒数第二个,因为最后一个已经排完了。(代码是从最后比上来,思想是一样的)
PS:假如那个最高个的在第一个,那么一直比较下去,他会一直和后面的人换位置,就好像冒泡泡似的,所以这就是冒泡排序。
双向冒泡排序:顾名思义,就是从两边冒泡排序,在同一趟比较中,从前面比较的,将高的顶到后面去,从后面比较的,将矮的顶到前面来。
选择排序:还是从第一个人开始,依次和后面的人比较,但是这个时候不交换位置,只是记录最矮那个人的位置(比如第五个)一直比较到最后一个人,然后将第五人和第一人交换位置,接下来从第二个人开始依次比较下去。
----------------------
更新:忘记说稳定排序和不稳定排序了。
稳定排序的意思是,小东和小明一样高,在排序前,小东是站在小明前面的,排序后,小东还是站在小明前面。
不稳定排序则是排序后小东跑到小明后面去了。
</pre><pre code_snippet_id="383221" snippet_file_name="blog_20140609_2_7667410" name="code" class="cpp">#include<stdio.h>
#define N 10
void BubbleSort(int *BS , int n)
{
int i=0;
int j=0;
int temp;
for( i=N-1; i>-1 ; i--)
{
//注意别让数组越界
for(j=0;j<i;j++)
{
if(BS[j]>BS[j+1])
{
temp=BS[j];
BS[j]=BS[j+1];
BS[j+1]=temp;
}
}
}
}
void SelectionSort(int *ss, int n)
{
int i;
int j;
int k;
int temp;
for(i=0; i<n-1 ; i++)
{
k=i;
for(j=i+1; j<n ; j++)
{
//记录数小的位置
if(ss[k]>ss[j])
k=j;
}
//k!=i则说明,有更小的数在后面,把它换到前面来
if(k!=i)
{
temp=ss[i];
ss[i]=ss[k];
ss[k]=temp;
}
}
}
void BubbleTwo( int *p , int n)
{
int i;
int low_point,high_point;
int high=n-1;
int low=0;
int temp;
while(high>low)
{
high_point=low;
low_point=high;
//为什么要在这里赋值呢?
//注意,我们下面的high_point 和 low_point是在if里面才有记录的,
//也就是说,如果一个序列已经是排好的,那么if语句是进不去的,那么就会进入死循环
for(i=0;i<high;i++)
{
if( p[i]>p[i+1] )
{
//把大的往后面冒,并将最后一次有交换的位置记下来,
//如果不记的话,只能从倒数第二个开始,这样即使你后面的本来就是排好了的也要再循环,浪费时间
temp=p[i];
p[i]=p[i+1];
p[i+1]=temp;
high_point=i;
}
if( p[high+low-i] < p[high+low-i-1])
{
temp=p[high+low-i];
p[high+low-i]=p[high+low-i-1];
p[high+low-i-1]=temp;
low_point = high+low-i;
}
}
low=low_point;
high=high_point;
}
}
void printArray(int *p)
{
int i;
for(i=0;i<N;i++)
printf("%d ",p[i]);
printf("\n");
}
int main()
{
int BS[N]={3,5,2,4,9,56,3,-5,1,0};
int BT[N]={5,8,3,9,1,0,4,34,-4,11};
int SS[N]={8,6,5,4,9,3,2,7,1,13};
printf("******冒泡排序之前******\n");
printArray( BS );
BubbleSort( BS , N);
printf("******冒泡排序之后******\n");
printArray( BS );
printf("\n******双向冒泡排序之前******\n");
printArray( BT );
BubbleTwo( BT , N );
printf("******双向冒泡排序之后******\n");
printArray( BT );
printf("\n******选择排序之前******\n");
printArray( SS );
SelectionSort(SS, N);
printf("******选择排序之前******\n");
printArray( SS );
return 0;
}</span>