首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

分享:小弟我自己写的各种排序算法

2012-02-19 
分享:我自己写的各种排序算法很久没在算法区发过帖子了,就发个帖子,分享一下我自己写的各种排序算法吧,呵

分享:我自己写的各种排序算法
很久没在算法区发过帖子了,就发个帖子,分享一下我自己写的各种排序算法吧,呵呵。
PS:下面的程序都是我自己写的,如果大家发现有BUG的话,请和我说一下,大家共同学习,共同进步。

C/C++ code
#include <iostream>#include <ctime>const int SIZE = 100;const int MAX = 1000;using namespace std;//交换数据void Swap(int &a, int &b){    int temp = a;    a = b;    b = temp;}//冒泡排序void BubbleSort(int *arr, int size){    int i, j;    for(i=0;i<size-1;i++)        for(j=size-1;j>i;j--)            if(arr[j] < arr[j-1])                Swap(arr[j], arr[j-1]);}//选择排序void SelectionSort(int *arr, int size){    int i, j, min;    //找出从a[i]到a[size-1]的最小元素的位置    for(i=0;i<size-1;i++)    {        min = i;        for(j=i+1;j<size;j++)            if(arr[min] > arr[j])                min = j;        //将a[i]与a[min]的数据交换        Swap(arr[i], arr[min]);    }}//插入排序void InsertSort(int *arr, int size){    int fOut, loc, temp;    for(fOut=1;fOut<size;fOut++)        if(arr[fOut] < arr[fOut-1])        {            temp = arr[fOut];            loc = fOut;            do            {                arr[loc] = arr[loc-1];                loc--;            }while(loc>0 && arr[loc-1]>temp);            arr[loc] = temp;        }}//快速排序int Partition(int *arr, int first, int last){    int i, small, x;    //为了减少最差情况的出现频率而作的一种优化    swap(arr[first], arr[ (first+last)/2 ]);    x = arr[first];    small = first;    for(i=first+1;i<=last;i++)        if(arr[i] < x)        {            small++;            swap(arr[small], arr[i]);        }        swap(arr[first], arr[small]);         return small;}void RecQuick(int *arr, int first, int last){    int pivotLoc;    if(first < last)    {        pivotLoc = Partition(arr, first, last);        RecQuick(arr, first, pivotLoc-1);        RecQuick(arr, pivotLoc+1, last);    }}void QuickSort(int *arr, int size){    RecQuick(arr, 0, size-1);}//计数排序void CountSort(int *arr, int size){    int temp[MAX] = {0};    int i, j;    for(i=0;i<size;i++)        temp[arr[i]]++;    j = 0;    for(i=0;i<MAX;i++)    {        while(0 != temp[i])        {            arr[j] = i;            temp[i]--;            j++;        }    }}//归并排序void Merge(int *arr, int start, int mid, int end){    int temp1[SIZE], temp2[SIZE];    int n1, n2;    int i, j, k;    n1 = mid - start + 1;    n2 = end - mid;    //拷贝前半部分数组    for(i=0;i<n1;i++)        temp1[i] = arr[start + i];    //拷贝后半部分数组    for(i=0;i<n2;i++)        temp2[i] = arr[mid + i + 1];    //把后面的元素设置的很大    temp1[n1] = temp2[n2] = INT_MAX;    i = j = 0;    // 逐个扫描两部分数组然后放到相应的位置去    for(k=start;k<=end;k++)    {        if(temp1[i] <= temp2[j])        {            arr[k] = temp1[i];            i++;        }        else        {            arr[k] = temp2[j];            j++;        }    }}void RecMerge(int *arr, int start, int end){    int i;    if(start < end)    {        i = (start + end) / 2;        RecMerge(arr, start, i);        RecMerge(arr, i+1, end);        Merge(arr, start, i, end);    }}void MergeSort(int *arr, int size){    RecMerge(arr, 0, size-1);}//堆排序void Heapify(int *arr, int low, int high){    int large;    int temp = arr[low];    large = 2 * low + 1;    while(large <= high)    {        if(large<high && arr[large]<arr[large+1])            large = large + 1;        if(temp > arr[large])            break;        else        {            arr[low] = arr[large];            low = large;            large = 2 * low + 1;        }    }    arr[low] = temp;}void BuildHeap(int *arr, int size){    int i;    for(i=size/2-1;i>=0;i--)        Heapify(arr, i, size-1);}void HeapSort(int *arr, int size){    int i;        //lastOfOrder    BuildHeap(arr, size);    for(i=size-1;i>=0;i--)    {        swap(arr[0], arr[i]);        Heapify(arr, 0, i-1);    }}//希尔排序void ShellSort(int *arr, int size){    int i, j, k, temp;    //i为增量    for(i=size/2;i>0;i/=2)    {        for(j=i;j<size;j+=i)        {            temp = arr[j];            k = j;            while(k-i>=0 && temp<arr[k-i])            {                arr[k] = arr[k-i];                k -= i;            }            arr[k] = temp;        }    }}//输出数组里的数据void Print(int *arr, int size){    int i;    for(i=0;i<size;i++)    {        printf("%6d ", arr[i]);         if(0 == (i+1) % 10)            cout << endl;    }    cout << endl;}//主函数//先随机选择100个整型数据放入数组中,并输出//然后将其从小到大排序,并输出int main(){    int arr[SIZE], i;    cout << "The array is: " << endl;    srand((unsigned)time(0));    for(i=0;i<SIZE;i++)        arr[i] = rand() % MAX;    Print(arr, SIZE);    //请选择其中一个排序算法,以运行该程序    //BubbleSort(arr, SIZE);    //SelectionSort(arr, SIZE);    //CountSort(arr, SIZE);    //InsertSort(arr, SIZE);    //SelectionSort(arr, SIZE);    //QuickSort(arr, SIZE);    //MergeSort(arr, SIZE);    //HeapSort(arr, SIZE);    ShellSort(arr, SIZE);    cout << "After sorting, the array is:" << endl;    Print(arr, SIZE);    return 0;} 



[解决办法]
学习~~~
有没有java版的??~··
[解决办法]
又有排序算法现世,速度来围观
[解决办法]
新手进来学习了
[解决办法]
探讨

这些算法的时间复杂度分别是多少啊?

[解决办法]
这些程序根本不是你写的.
网上搜索得到的.
讲话得也要靠谱
[解决办法]
能让大家有所收获就行!
[解决办法]
探讨
能让大家有所收获就行!

[解决办法]
嗯,不错,帮顶一下!

热点排行