现在的位置: 首页 > 综合 > 正文

【备战2014笔面试】排序算法(1)

2013年04月21日 ⁄ 综合 ⁄ 共 1457字 ⁄ 字号 评论关闭

以前对排序算法总是懵懵懂懂的,现在参考了一个大神的博客文章,又自己把程序调了一遍,确实是有些收获

http://blog.csdn.net/laoyang360/article/details/7944448

#include<iostream>

using namespace std;


//直接插入排序,利用交换实现 
void directInsertSort1(int arr[], int N)  
{  
       int i;  
       int j;  
       
       for( i = 1; i < N; i++)  
       {    
              for(j = i-1; j >= 0 ; j--)  
              {                      
                     if(arr[j+1] < arr[j])
                     {
                             //交换
                             swap(arr[j+1],arr[j]); 
                     }else{
                           
                           break;                     
                     }                                                                  
              }  
       }  
}

//直接插入排序,利用插入实现 
void directInsertSort2(int arr[], int N)  
{  
       int i;  
       int j;  
       
       for( i = 1; i < N; i++)  
       {      
              int temp = arr[i];               
            
              for(j = i-1; j >= 0 ; j--)  
              {                      
                     if(temp < arr[j])
                     {
                             //向后移位 
                             arr[j+1] = arr[j]; 
                             
                     }else{
                           
                           break;                     
                     }                                                                  
              }
              
              //注意这里边界条件的确定 
              arr[j+1] = temp;
                             
       }  
} 


//经典冒泡排序 
void BubuleSort1(int a[], int N)  
{  
       int i,j;  
       for(i= 0; i < N; i++)  
       {  
              for(j= 0; j < N-i-1; j++)  
              {  
                     if(a[j]> a[j+1])  
                     {  
                            swap(a[j],a[j+1]);  
                     } 
              }
       }
}

//改进冒泡,若内循环已经无需交换,则说明剩下的已经排好序了 
void BubuleSort2(int a[], int N)  
{  
       int i,j;  
       bool bExchange = true;         //初始设定为true  
       
       for(i= 0; i < N && bExchange; i++)  
       {  
              bExchange= false;        //进入循环则设定为false  
              for(j= 0; j < N-i-1; j++)  
              {  
                     if(a[j]> a[j+1])  
                     {  
                            swap(a[j],a[j+1]);  
                            bExchange = true;//存在交换则变为true.  
                     } 
              }
       }
}


//选择排序
//同直接插入排序,将元素分为有序区和无序区。所不同的是,直接插入排序是将无序区域中第一个元素插入到有序区域以形成更大的有序区;而选择排序是从无序区域中选择最小的元素放入有序区的最后。

void SelectSort(int arr[], int N)  
{  
       int minPos;  
       
       for(int i = 0; i < N; i++)  
       {  
              minPos= i;  
              
              for(int j = i+1; j < N; j++)  
              {  
                     if(arr[j]< arr[minPos])  
                     {  
                            minPos = j;
                            //我以前直接在这里交换,开销实在太大,这里只需要记录最小元素的序号即可...  
                     }  
              }  
              
              if(minPos!= i)  
              {  
                     swap(arr[minPos],arr[i]);//交换  
              }  
       }  
}   


//希尔排序
//将待排序的序列按照步长划分子序列,对子序列进行直接插入排序,然后递减步长直至为1(最小步长),这样整个序列就会基本有序,然后进行最后一次直接插入排序即可。

void ShellSort(int arr[], int N)  
{  
       int i;  
       int j;  
       int step;
         
       for( step = N/2; step > 0; step/=2)  
       {  
              for(i= step; i < N; i++) //注意此处递增的步长为1,依次比较!  
              {  
                     //这里很关键,必须控制步长 
                     for(j = i-step; j >= 0 && arr[j+step] < arr[j]; j = j- step)  
                     {  
                            swap(arr[j+step],arr[j]);  
                     }
              } 
       }
} 


抱歉!评论已关闭.