随笔 - 0, 文章 - 4, 评论 - 0, 引用 - 0
数据加载中……

算法导论学习笔记:插入排序、合并排序、冒泡排序

插入排序使用的是增量方法:在排好序的子数组A[1:j-1]后,将元素A[j]插入,形成排好序的子数组A[1:j].
插入排序的代码(C++):
 1 /*
 2  *
 3  *
 4  *       Filename:  insert_sort.cc
 5  *
 6  *    Description:  insert sort
 7  *
 8  *        Version:  1.0
 9  *        Created:  2011年03月12日 23时15分09秒
10  *       Revision:  none
11  *       Compiler:  gcc
12  *
13  *         Author:  Moking (ac), tzrac119@gmail.com
14  *        Company:  Unknown
15  *
16  *
17  */
18 
19 #include<iostream>
20 
21 using namespace std;
22 
23 int main()
24 {
25     int A[]={5,2,4,6,1,3};
26     int i,j,key;
27 
28     for(j = 1; j != 6; j++)
29     {
30         //每次循环插入的值赋给key
31         //其中A[1:j-1]是已排序的。
32         key=A[j];
33         i = j-1;
34         while((i != -1&& A[i] > key)
35         {
36             //交换顺序
37             A[i+1= A[i];
38             i--;
39         }
40         A[i+1]=key;
41     }
42     //输出结果
43     for(int k = 0; k != 6; k++)
44         cout << A[k] << " " ;
45     cout << endl;
46     return 0;
47 }
合并排序算法采用“分治法“。
/*
 *
 *       Filename:  merge_sort.cc
 *
 *    Description:  merge sort
 *
 *        Version:  1.0
 *        Created:  2011年03月12日 23时51分38秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Moking (ac), tzrac119@gmail.com
 *        Company:  Unknown 
 *
 
*/
#include
<iostream>

using namespace std;

int  MAX=32767;



//合并函数
void merge(int *A,int p,int q,int r)
{
    
int n1 = q - p + 1;
    
int n2 = r - q;
    
//初始化数组元素
    int L[n1+1];
    
int R[n2+1];

    
for(int i = 0; i != n1; i++)

        L[i] 
= *(A+p+i-1);

    
for(int j = 0; j != n2; j++)

        R[j] 
= *(A+q+j);
    
    
//通过设置"哨兵牌",避免检查是否没堆牌是否为空
    L[n1] = MAX;
    R[n2] 
= MAX;

    
int i1=0,j1=0;

    
for(int k = p-1 ; k != r; k++)
    {
        
if(L[i1] <= R[j1])
        {
            
*(A+k) = L[i1];
            i1
++;
        }
        
else
        {
            
*(A+k) = R[j1];
            j1
++;
        }
    
    }

}

void merge_sort(int *A,int p,int r)
{
    
if(p < r)
    {
        
int q = (p+r)/2;
        merge_sort(A, p, q);
        merge_sort(A, q
+1, r);
        merge(A, p, q, r);       
    }
}

int main()
{
    
int A[] = {13,14,15,8,9,1,3,4,7,5,2,6,10,11,12};
    merge_sort(A,
1,15);

    
//输出结果
    for(int i=0; i!=15; i++)
        cout 
<< A[i] << " " ;
        cout 
<< endl;
   
    return 0;
}


冒泡排序算法是一种流行的排序算法,它重复地交换相邻的两个反序元素。
/*
 * =====================================================================================
 *
 *       Filename:  bubble_sort.cc
 *
 *    Description:  bubble sort
 *
 *        Version:  1.0
 *        Created:  2011年03月13日 00时48分14秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Mnking (ac), tzrac119@gmail.com
 *        Company:  Unknown
 *
 * =====================================================================================
 
*/

#include 
<iostream>

using namespace std;


    
int main()
{
    
int ia[]={2,3,5,8,9,7,18,27,38,32,54,18,6,12,21};

    
for(int i = 0; i != 15;i++)
    {
        
for(int j = 14;j != i; j--)
        {
            
if(ia[j]<ia[j-1])
            {
                
int temp = ia[j-1];
                ia[j
-1= ia[j];
                ia[j] 
= temp;
            }
        }
    }

    
    
//输出结果
    
    
    
for(int j1 = 0; j1 != 15;j1++
        cout 
<< ia[j1] << " "
    cout 
<< endl;

    
    
return 0;
}


posted on 2011-03-12 23:46 Moking 阅读(152) 评论(0)  编辑 收藏 引用 所属分类: 算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理