几个排序算法

《 算法导论》上的几个排序算法。

1. 合并排序1(merge sort)
#include <stdio.h>        // printf
#include <limits.h>    // INT_MAX
#include <stdlib.h>    // system

void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


void merge(int A[], int p, int q, int r)
{
    
int n1 = q - p + 1;
    
int n2 = r - q;
    
int i, j, k;
    
// create arrays L[1...n1+1] and R[1..n2+1]
    int *= new int[n1+1];
    
int *= new int[n2+1];

    
for (i=0; i<n1; ++i)
    
{
        L[i] 
= A[p+i];
    }

    
for (j=0; j<n2; ++j)
    
{
        R[j] 
= A[q+1+j];
    }

    
// sentinel
    L[n1] = INT_MAX;
    R[n2] 
= INT_MAX;

    i 
= j = 0;
    
for (k=p; k<r+1++k)
    
{
        
if (L[i] < R[j])
        
{
            A[k] 
= L[i];
            
++i;
        }

        
else
        
{
            A[k] 
= R[j];
            
++j;
        }

    }


    delete [] L;
    delete [] R;
}


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 argc, char* argv[])
{
    
{
        
int A[] = {524613};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        merge_sort(A, 
0, size-1);
        printArray(A, size);
    }


    
{
        
int A[] = {314159264158};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        merge_sort(A, 
0, size-1);
        printArray(A, size);
    }

    system(
"pause");
    
return 0;
}
2. 合并排序2(merge sort)
#include <stdio.h>        // printf
#include <limits.h>    // INT_MAX
#include <stdlib.h>    // system

// length that using insertion-sort 
const int K = 4;

void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


void insertion_sort(int A[], int p, int r)
{
    
for (int j = p+1; j < r+1++j)
    
{
        
int key = A[j];
        
int i = j - 1;
        
while (i>=&& A[i]>key) 
        
{
            A[i
+1= A[i];
            
--i;
        }

        A[i
+1= key;
    }

}


void merge(int A[], int p, int q, int r)
{
    
int n1 = q - p + 1;
    
int n2 = r - q;
    
int i, j, k;
    
    
// create arrays L[1...n1+1] and R[1..n2+1]
    int *= new int[n1+1];
    
int *= new int[n2+1];

    
for (i=0; i<n1; ++i)
    
{
        L[i] 
= A[p+i];
    }

    
for (j=0; j<n2; ++j)
    
{
        R[j] 
= A[q+1+j];
    }

    
// sentinel
    L[n1] = INT_MAX;
    R[n2] 
= INT_MAX;

    i 
= j = 0;
    
for (k=p; k<r+1++k)
    
{
        
if (L[i] < R[j])
        
{
            A[k] 
= L[i];
            
++i;
        }

        
else
        
{
            A[k] 
= R[j];
            
++j;
        }

    }


    delete [] L;
    delete [] R;
}


void merge_sort(int A[], int p, int r)
{
    
if (p < r)
    
{
        
if (r - p < K)
        
{
            insertion_sort(A, p, r);
        }

        
else
        
{
            
int q = (p + r)/2;
            merge_sort(A, p, q);
            merge_sort(A, q
+1, r);
            merge(A, p, q, r);
        }

    }

}


int main(int argc, char* argv[])
{
    
{
        
int A[] = {524613};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        merge_sort(A, 
0, size-1);
        printArray(A, size);
    }


    
{
        
int A[] = {3141592641582345567790123326573234278};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        merge_sort(A, 
0, size-1);
        printArray(A, size);
    }

    system(
"pause");
    
return 0;
}
3. 插入排序(insertion sort)
#include <stdio.h> // printf
#include <stdlib.h> // system

void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


void insertion_sort(int *A, int size)
{
    
for (int j = 1; j < size; ++j)
    
{
        
int key = A[j];
        
int i = j - 1;
        
while (i>=0&&A[i]>key) 
        
{
            A[i
+1= A[i];
            
--i;
        }

        A[i
+1= key;
    }

}


int main(int argc, char* argv[])
{
    
{
        
int A[] = {524613};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        insertion_sort(A, size);
        printArray(A, size);
    }


    
{
        
int A[] = {314159264158};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        insertion_sort(A, size);
        printArray(A, size);
    }

    system(
"pause");
    
return 0;
}


4. 堆排序(heap sort)
#include <stdio.h>        // printf
#include <stdlib.h>    // system

#define PARENT(i)    ((i
-1)/2)
#define LEFT(i)    ((i)
*2+1)
#define RIGHT(i) ((i)
*2 + 2)

void max_heapify(int A[], int i, int size)
{
    
int l = LEFT(i);
    
int r = RIGHT(i);
    
int largest = i;
    
if (l<size && A[l]>A[i])
    
{
        largest 
= l;
    }

    
if (r<size && A[r]>A[largest])
    
{
        largest 
= r;
    }

    
if (largest != i)
    
{
        
int t = A[i];
        A[i] 
= A[largest];
        A[largest] 
= t;
        max_heapify(A, largest, size);
    }

}


void build_max_heap(int A[], int size)
{
    
for (int i = PARENT(size-1); i >=0--i)
    
{
        max_heapify(A, i, size);
    }

}


void heap_sort(int A[], int size)
{
    build_max_heap(A, size);
    
for (int i = size -1; i>0--i)
    
{
        
int t = A[0];
        A[
0= A[i];
        A[i] 
= t;
        max_heapify(A, 
0, i);
    }

}


void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


int main()
{
    
{
        
int A[] = {524613};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        heap_sort(A, size);
        printArray(A, size);
    }


    
{
        
int A[] = {314159264158};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        heap_sort(A, size);
        printArray(A, size);
    }


    
{
        
int A[] = {5132257172084};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        heap_sort(A, size);
        printArray(A, size);
    }

    system(
"pause");
    
return 0;
}
 5. 快速排序(quick sort)
#include <stdio.h>        // printf
#include <stdlib.h>    // system

int partition(int A[], int p, int r)
{
    
int x = A[r];
    
int i = p - 1;
    
for(int j = p; j<r; ++j)
    
{
        
if (A[j] <= x)
        
{
            
++i;
            
int t = A[j];
            A[j] 
= A[i];
            A[i] 
= t;
        }

    }

    A[r] 
= A[i + 1];
    A[i 
+ 1= x;

    
return i + 1;
}


int hoare_partition(int A[], int p, int r)
{
    
int x = A[p];
    
int i = p - 1;
    
int j = r + 1;
    
while (1)
    
{
        
do 
        
{
            
--j;
        }
 while(A[j] > x);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        
do 
        
{
            
++i;
        }
 while(A[i] <= x);

        
// exchange A[i] and A[j]
        if (i < j)
        
{
            
int t = A[i];
            A[i] 
= A[j];
            A[j] 
= t;
            
continue;
        }

        
else
        
{
            A[p] 
= A[j];
            A[j] 
= x;
            
return j;
        }

            
    }


}


void quick_sort(int A[], int p, int r)
{
    
if (p < r)
    
{
        
int q = hoare_partition(A, p, r);
        quick_sort(A, p, q
-1);
        quick_sort(A, q
+1, r);
    }

}


void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


int main(int argc, char *argv[])
{
    
{
        
int A[] = {524613};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        quick_sort(A, 
0, size - 1);
        printArray(A, size);
    }


    
{
        
int A[] = {13199512874212611};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        quick_sort(A, 
0, size - 1);
        printArray(A, size);
    }


    system(
"pause");
    
return 0;
}
6. stooge排序
#include <stdio.h> // printf
#include <stdlib.h> // system

void printArray(int A[], int size)
{
    
for(int i=0; i<size; ++i)
    
{
        printf(
"%d ", A[i]);
    }

    printf(
" ");
}


void stooge_sort(int A[], int i, int j)
{
    
if (A[i] > A[j])
    
{
        
// exchange
        int t = A[i];
        A[i] 
= A[j];
        A[j] 
= t;
    }

    
if (i+1>=j)
        
return;
    
int k = (j-i+1)/3;                // Round down.
    stooge_sort(A, i, j - k);    // First two-thirds.
    stooge_sort(A, i + k, j);    // Last two-thirds.
    stooge_sort(A, i, j - k);    // First two-thirds again.
}


int main(int argc, char* argv[])
{
    
{
        
int A[] = {3141592641582345567790123326573234278};
        
int size = sizeof(A)/sizeof(int);
        printArray(A, size);
        stooge_sort(A, 
0, size-1);
        printArray(A, size);
    }

    system(
"pause");
    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值