排序算法总结

各种排序算法总结

//
//  mySorts.c
//  mySorts
//
//  Created by chen on 13-9-25.
//  Copyright (c) 2013年 chen. All rights reserved.
//

#include <stdio.h>
#include "mySorts.h"


/**
 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。
 要点:设立哨兵,作为临时存储和判断数组边界之用。
 
 **/
void insertSort(int a[], int length)
{
    printf("paixu\n");
    int i, j, k;
    for (i = 1; i < length; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;
        
        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //将比a[i]大的数据向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        }
    }
    for (int n=0; n<length; n++) {
        printf("%d ", a[n]);
    }
    
}

void insertSort2(int a[], int length)
{
    int i, j;
    for (i=1; i<length; i++) {
        if (a[i] < a[i-1]) {
            int temp = a[i];
            for (j=i-1; j>=0&&temp<a[j]; j--) {
                a[j+1] = a[j];
            }
            a[j+1] = temp;
        }
    }
}

void shell(int a[], int length, int gap)
{
    int i,j;
    //int gap = length/2;
    for (i=gap+1; i<length; i++) {
        if (a[i] < a[i-gap]) {
            int temp = a[i];
            j = i-gap;
            while (j>0 && a[j]>temp) {
                a[j+gap] = a[j];
                j = j-gap;
            }
            a[j+gap] = temp;
        }
    }
}

void shellSort(int a[], int length)
{
    int gap = length/2;
    while (gap >= 1) {
        shell(a, length, gap);
        gap = gap/2;
    }
}

void bubbleSort(int a[], int length)
{
    int i,j;
    int exchange = 1;
    for (i=0; i<length; i++) {
        exchange = 0;
        for (j=length-1; j>=i; j--) {
            int temp = 0;
            if (a[j+1] < a[j]) {
                temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
                exchange = 1;
            }
        }
        if (!exchange) {
            return;
        }
    }
}

int partition(int a[], int i, int j)
{
    int  par = a[i];
    while (i<j) {
        while (i<j && a[j]>=par) {
            j--;
        }
        if (i<j) {
            a[i] = a[j];
            i++;
        }
        
        while (i<j && a[i]<=par) {
            i++;
        }
        if (i<j) {
            a[j] = a[i];
            j--;
        }
    }
    a[i] = par;
    return i;
}

void quickSort(int a[], int low, int high)
{
    int parpos;
    if (low < high) {
        parpos = partition(a, low, high);
        quickSort(a, low, parpos-1);
        quickSort(a, parpos+1, high);
    }
}

void selectSort(int a[], int length)
{
    int i,j,k;
    int temp;
    for (i = 0; i<length; i++) {
        k = i;
        for (j=i+1; j<length; j++) {
            if (a[j] < a[k]) {
                k=j;
            }
        }
        if (k != i) {
            temp = a[i];
            a[i] = a[k];
            a[k] = temp;
        }

    }
}

void printArray(int a[], int length)
{
    for (int i=0; i<length; i++) {
        printf("%d ",a[i]);
    }
    printf("\n");
}

void maxHeapify(int a[],int i, int length)
{
    int left = 2*i;
    int right = 2*i+1;
    int largest = i;
    if (left < length && a[left]>a[i]) {
        largest = left;
    }
    if (right < length && a[right]>a[largest]) {
        largest = right;
    }
    if (largest != i) {
        int temp = a[i];
        a[i] = a[largest];
        a[largest] = temp;
        maxHeapify(a, largest, length);
    }
}

void buildMaxHeap(int a[], int length)
{
    for (int i=length/2; i>=0; i--) {
        maxHeapify(a, i, length);
    }
}

void heapSort(int a[], int length)
{
    
    buildMaxHeap(a, length);
    printf("MaxHeap..");
    printArray(a, length);
    
    int len = length;
    for (int i=length-1; i>=1; i--) {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        len--;
        maxHeapify(a, 0, len);
        printf("processing..");
        printArray(a, length);
    }
}

void mergeArray(int a[], int first, int mid, int last, int temp[])
{
    int i = first;
    int j = mid+1;
    int m = mid;
    int n = last;
    int k = 0;
    
    while (i <= m && j<=n) {
        if (a[i] < a[j]) {
            temp[k++] = a[i++];
        }
        else
        {
            temp[k++] = a[j++];
        }
    }
    
    while (i <= m) {
        temp[k++] = a[i++];
    }
    
    while (j <= n) {
        temp[k++] = a[j++];
    }
    
    for (i =0; i<k; i++) {
        a[first+i] = temp[i];
    }
}

void mergesort(int a[], int first, int last, int temp[])
{
    if (first < last) {
        int mid = (first+last)/2;
        mergesort(a, first, mid, temp);
        mergesort(a, mid+1, last, temp);
        mergeArray(a, first, mid, last, temp);
    }
}

void mergeSort(int a[], int length)
{
    int *p = (int*)malloc(sizeof(int)*length);
    if (p == NULL) {
        return;
    }
    mergesort(a, 0, length-1, p);
    free(p);
    p=NULL;
}

 

posted @ 2013-11-06 12:37  chenxiaojian  阅读(184)  评论(0编辑  收藏  举报