俊介三

一天更新一点,一天积累一点

导航

排序

Posted on 2013-03-24 15:25  俊介三在前进  阅读(161)  评论(0)    收藏  举报

插入排序、快速排序、归并排序、冒泡排序、选择排序、希尔排序。

如下:

 

#include <stdio.h>

void swap(int& a, int& b){
    int temp = a;
    a = b;
    b = temp;
}

void print(int* arr, int len){
    int i;
    for(i=0;i<len;i++){
        if(i==0) printf("%d",arr[i]);
        else printf(" %d",arr[i]);
    }
    puts("");
}

//insert sort. find the samllest one and swap to the first place
void insert_sort(int* arr,int len){
    int i,j;
    for(i=0;i<len-1;i++){
        for(j=i+1;j<len;j++){
            if(arr[i]>arr[j]){
                swap(arr[i],arr[j]);
            }
        }
    }
    print(arr,len);
}

//find a pivot, and cut the array into two part, each part is smaller and bigger this pivot.
//doing this recursively
void quick_sort(int* arr, int start, int end){
    if(start>=end) return;
    int left=start, right=end, pivot;
    pivot = arr[left];
    while(left<right){
        while(left<right && arr[right]>=pivot) right--;
        if(left<right) arr[left++] = arr[right];
        while(left<right && arr[left]<=pivot) left++;
        if(left<right) arr[right--] = arr[left];
    }
    arr[left] = pivot;
    if(start<left-1) quick_sort(arr,start,left-1);
    if(end>left+1) quick_sort(arr,left+1,end);
}

//cut the array into two half recursively, and finally merge them in order
void merge(int*arr, int start, int mid, int end){
    int* temp1 = new int[mid-start+1];
    int* temp2 = new int[end-mid];
    int i;
    for(i=start;i<=mid;i++) temp1[i-start] = arr[i];
    for(i=mid+1;i<=end;i++) temp2[i-mid-1] = arr[i];
    int p1 = 0;
    int p2 = 0;
    for(i=start;i<=end;i++){
        if(temp1[p1]>temp2[p2] && p2<=end-mid-1 || p1==mid+1-start) arr[i] = temp2[p2++];
        else arr[i] = temp1[p1++];
    }
    delete[] temp1;
    delete[] temp2;
}

void merge_sort(int* arr, int start, int end){
    if(start>=end) return;
    int mid = (start+end)/2;
    merge_sort(arr,start,mid);
    merge_sort(arr,mid+1,end);
    merge(arr,start,mid,end);
}

//bubble sort
void bubble_sort(int* arr, int len){
    int i,j;
    for(i=len-1;i>=0;i--){
        for(j=0;j<i;j++){
            if(arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

//selection sort
void select_sort(int* arr, int len){
    int i, j;
    for(i=0;i<len-1;i++){
        for(j=i+1;j<len;j++){
            if(arr[i]>arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

//shell sort
void shell_sort(int *data, int size)
{
    for (int gap = size / 2; gap > 0; gap /= 2)
        for (int i = gap; i < size; ++i)
        {
 
             int key = data[i];
             int j = 0;
             for( j = i -gap; j >= 0 && data[j] > key; j -=gap)
             {
                data[j+gap] = data[j];
              }  
             data[j+gap] = key;
         }
}

int main(){
    int i;
    int arr1[] = {99,2,8,1,8,23,98,12,83,12,32,4};
    insert_sort(arr1,sizeof(arr1)/sizeof(int));

    int arr2[] = {99,2,8,1,8,23,98,12,83,12,32,4};
    quick_sort(arr2,0,11);
    print(arr2,12);

    int arr3[] = {99,2,8,1,8,23,98,12,83,12,32,4};
    merge_sort(arr3,0,11);
    print(arr3,12);

    return 0;
}