最近总结了的排序算法

 

// This function is used to sort numbers
#include"stdio.h"
#include
"stdlib.h"
#include
"conio.h"
#define SIZE 5
#define EQ(a,b)   ((a)==(b))
#define LT(a,b)   ((a)<(b))
#define LQ(a,b)   ((a)>(b))
#define Exchange(a,b)  {a = a ^ b ; b = a ^ b ; a = a ^ b;}
//#define DEBUG

void strInsertSort ( int * list)  //Straight Insertion Sort
{
 
for ( int i = 1 ; i < SIZE ; i ++ )
 {
  
if ( LT(list[i],list[i-1] )) //if the number is smaller than the number before it ,it need to insert
  {
   
int temp = list[i] ;
   list[i] 
= list[i-1] ;//let the elem move back 
   for ( int j = i-2 ;LT(temp , list[j])&&>= 0 ; j -- )
                list [j
+1= list [j];
   list[j
+1= temp;

  }
 }
}

void EbullitionSort ( int* list)  //Ebulliton Sort
{
 
int flag = 1;
 
for ( int i = 0 ;i < SIZE && flag ; i ++ )
  
for ( int j = i + 1 ; j < SIZE ; j ++ )
  {
   flag 
= 0;
   
if ( list[i] < list[j] )
   {
    flag 
= 1 ;
    Exchange ( list[i] ,list[j] );
#ifdef DEBUG
                printf ( 
"%d%d" ,list[i] ,list[j]);
    getch() ;
#endif    
   }
  }

 }


void BInsertSort ( int * list )  //Binary Insert Sort
{
 
for ( int i = 0 ; i < SIZE ; i ++ )
 { 
       
int temp = list [i] ;
    
int low = 0 ;
    
int high = i - 1;
    
while ( low <= high )
    {
     
int m = (high + low) >> 1 ;
     
if ( LT ( temp ,list[m] ))
        high 
= m - 1;
     
else 
      low 
= m + 1;
    }
    
for ( int j = i - 1 ; j >= high + 1 ; j -- )
     list[j
+1= list[j] ;
    list[high 
+ 1= temp ;
 }

}

void shellInsert ( int * list , int dk )  //ShellInsert in shell Sort
{
 
for ( int i = dk ; i < SIZE ; i ++ )
 {
  
if ( LT ( list[i],list[i-dk] ) )
  {
   
int temp = list[i] ;
   
for ( int j = i-dk ; LT(temp , list[j]) && j >= 0 ; j -= dk )
    list[j
+dk] = list[j] ;
   list[j
+dk] = temp ;
  }
 }
 
}

void shellInsert ( int *list ) //shellInsert
{
 
int dk[3= { 5,3,1 } ;
 
for ( int i = 0 ; i < 3 ;i ++ )
  shellInsert(list , dk[i]);
}

// Qiuck Sort 

int Parttion ( int * list , int low ,int high ) //split the list to two part
{
 
int temp = list[low] ;// let the number in low as pivotkey
 int pivotkey = list[low] ;
 
while ( low < high )
 {
        
while( low < high && list[high] >= pivotkey ) high -- ;
  list[low] 
= list[high] ;
  
while ( low < high && list[low] <= pivotkey ) low ++ ;
  list[high] 
= list[low] ;
 }
 list[low] 
= temp ;
 
return low ;
}

void QiuckSort ( int *list , int low , int high )  //qiuck sort
{
 
if ( low < high )
 {
  
int pivotloc = Parttion ( list , low ,high );
        QiuckSort ( list , low ,pivotloc
-1) ;
  QiuckSort ( list ,pivotloc
+1 ,high) ;
 }
}
//Simple Select  Sort
int SelectMinKey( int * list ,int i )  //Find the MInest number in list begin with i
{
    
int min = i ;
     
for ( int j = i + 1  ; j < SIZE ;j ++
   
if ( list[j] < list[j-1] ) min = j;
    
return min ;

}
void  SelectSort ( int * list )
{
 
for ( int i = 0 ; i < SIZE ; i ++ )
 {
  
int j = SelectMinKey( list ,i );
  
if ( j != i )
  {
            
//Exchange(list[i],list[j]);
  int temp = list[i] ;
  list[i] 
= list[j];
     list[j] 
= temp ;
  }

 }
}
//Heap Sort
void HeapAdjust ( int * list , int s ,int m) //let the number from s to m to be heap
{
 
int temp = list [s] ;
 
for ( int j = 2 * s + 1 ; j <= m ;j *= 2)
    {
  
if ( j < m && LT( list[j],list[j+1] ) )
   j 
++ ;
  
if ( LQ(temp , list[j] ) )
   
break ;
  list [s] 
= list [j] ;
  s 
= j ;
 }
 list [s] 
= temp ;

}

//HeapSort
void HeapSort ( int * list )
{
    
for ( int i = (SIZE / 2  - 1 ); i >= 0 ; i -- )
  HeapAdjust ( list , i , SIZE 
- 1 );
 
for ( int j = SIZE - 1 ; j > 0 ; j -- )
 {
  
int temp = list [0] ;
  list [
0= list [j] ;
  list [j] 
= temp ;
        HeapAdjust ( list , 
0 , j - 1);  

 }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值