1.冒泡排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定,比较次数已知;
缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。
初始关键字 [49 3865 97 76 13 27 49]
第一趟排序后 [38 4965 76 13 27 49] 97
第二趟排序后 [38 4965 13 27 49] 76 97
第三趟排序后 [38 4913 27 49] 65 76 97
第四趟排序后 [38 1327 49] 49 65 76 97
第五趟排序后 [38 1327] 49 49 65 76 97
第六趟排序后 [13 27]38 49 49 65 76 97
第七趟排序后 [13] 2738 49 49 65 76 97
最后排序结果 13 2738 49 49 76 76 97
#include
using namespace std;
void main() {
int i,j,k;
int a[8]={49,38,65,97,76,13,27,49};
for(i=7;i>=0;i--) {
for(j=0;j
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
} } }
for(i=0;i<8;i++)
cout<
2.选择排序
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区.这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
优点:稳定,比较次数与冒泡排序一样;
缺点:相对之下还是慢。
初始关键字 [49 3865 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 2738 [97 76 49 65 49]
第四趟排序后 13 2738 49 [49 97 65 76]
第五趟排序后 13 2738 49 49 [97 97 76]
第六趟排序后 13 2738 49 49 76 [76 97]
第七趟排序后 13 2738 49 49 76 76 [ 97]
最后排序结果 13 2738 49 49 76 76 97
#include
using namespace std;
void main()
{
int i,j,k,t;
int R[8]={49,38,65,97,76,13,27,49};
for(i=0;i<7;i++) { k=i;
for(j=i+1;j<8;j++)
if(R[j] k=j; if(k!=i) { t=R[j];R[j]=R[k];R[k]=t; } } for(i=0;i<8;i++) cout< 3.插入排序 已知一组,一组无序数据b[1]、b[2]、……b[m],需将其变成一个升序数列。先创建一个变量a。首先将不b[1]与b[2],如果b[1]大于b[2]则交换位置,否则不变;再比较b[2]与b[3],如果b[3]小于b[2],则将b[3]赋值给a,再将a与b[1]比较,如果a小于b[1];则将b[2],b[1]依次后移;在将a放在b[1]处以此类推,直到排序结束。 初始关键字 [49 3865 97 76 13 27 59] a b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] 1-----49 49 > 38 65 97 76 13 27 59 38 49 49 ………. 38 38 49 ………. 2-----38 38 49 < 65 97 76 13 27 59 3-----38 38 49 65 <97 76 13 27 59 4----38 38 49 65 97> 76 13 27 59 76 38 49 65 97 97…….. 76 38 49 65 76 97…….. 以此类推 void insertSort(Type* arr,long len) { long i=0,j=0; for(i=1;i j=i; tmpData=arr[j];//tmpData用来储存数据 while(tmpData0) { arr[j]=arr[j-1]; j--; } arr[j]=tmpData;