十大排序C语言实现

#include<stdio.h>
#include<stdlib.h>
void bubbleSort(int arr[],int size);
void SelectionSort(int *arr, int size); 
void InsertionSort(int *arr, int size);
void ShellSort(int *arr, int size); 
void Merge(int *SR, int *TR, int i, int middle, int rightend); 
void MergeSort(int *SR, int *TR1, int s, int t); 
void swap(int *a, int *b)  ;
void QuickSort(int *arr, int maxlen, int begin, int end); 
void HeapSort(int *arr, int size);
void CountSort(int *arr,int n);
void bucketSort(int *arr, int size);
void RadixSort(int *arr, int len, int dec, int order);
int main()
{
	int arr[10] = {1,9,6,3,5,2,4,8,7,10},i=0;
	
	//BubbleSort(arr,10);
	//SelectionSort(arr,10);
	//InsertionSort(arr,10);
	//ShellSort(arr,10);
	//int arr_merge[10]={0};
	//MergeSort(arr,arr_merge,0,9);
	//QuickSort(arr,10,0,9);
	//HeapSort(arr,9);
	//CountSort(arr,10); 
	//bucketSort(arr,10);
	RadixSort(arr,10,2,1); 
	for(i=0;i<10;i++)
	{
		printf("arr[%d] = %d
",i,arr[i]);
	}
	printf("
");
	return 0; 
}
/*冒泡排序*/
void BubbleSort(int arr[], int size)  
{  
    int i, j, tmp;  
    for (i = 0; i < size - 1; i++) {  
        for (j = 0; j < size - i - 1; j++) {  
            if (arr[j] > arr[j+1]) {  
                tmp = arr[j];  
                arr[j] = arr[j+1];  
                arr[j+1] = tmp;  
            }  
        }  
    }  
} 
/*选择排序*/
void SelectionSort(int *arr, int size)
{
    int i, j, k, tmp;
    for (i = 0; i < size - 1; i++) {
        k = i;
        for (j = i + 1; j < size; j++) {
            if (arr[j] < arr[k]) {
                k = j;
            }
        }
        tmp = arr[k];
        arr[k] = arr[i];
        arr[i] = tmp;
    }
}
/*插入排序*/
void InsertionSort(int *arr, int size)    
{    
    int i, j, tmp;    
    for (i = 1; i < size; i++) {    
        if (arr[i] < arr[i-1]) {    
            tmp = arr[i];    
            for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {  
                arr[j+1] = arr[j];    
            }  
            arr[j+1] = tmp;    
        }          
    }    
}  
/*希尔排序*/
void ShellSort(int *arr, int size)  
{  
    int i, j, tmp, increment;  
    for (increment = size/ 2; increment > 0; increment /= 2) {    
        for (i = increment; i < size; i++) {  
            tmp = arr[i];  
            for (j = i - increment; j >= 0 && tmp < arr[j]; j -= increment) {  
                arr[j + increment] = arr[j];  
            }  
            arr[j + increment] = tmp;
        }  
    }  
}  
/*归并排序*/
void Merge(int source[],int temp[], int start, int mid, int end)
{
    int i = start, j=mid+1, k = start;
    while(i!=mid+1 && j!=end+1)
    {
        if(source[i] > source[j])
            temp[k++] = source[j++];
        else
            temp[k++] = source[i++];
    }
    while(i != mid+1)
        temp[k++] = source[i++];
    while(j != end+1)
        temp[k++] = source[j++];
    for(i=start; i<=end; i++)
        source[i] = temp[i];
}
//内部使用递归
void MergeSort(int source[], int temp[], int start, int end)
{
    int mid;
    if(start < end)
    {
        mid = start + (end-start) / 2;//避免溢出int
        MergeSort(source, temp, start, mid);
        MergeSort(source, temp, mid+1, end);
        Merge(source, temp, start, mid, end);
    }
}
/*快速排序*/ 
void QuickSort(int *arr, int maxlen, int begin, int end)  
{  
    int i, j;  
    if (begin < end) {  
        i = begin + 1;  
        j = end;        
        while (i < j) {  
            if(arr[i] > arr[begin]) {  
                swap(&arr[i], &arr[j]); 
                j--;  
            } else {  
                i++; 
            }  
        }  
        if (arr[i] >= arr[begin]) {  
            i--;  
        }  
        swap(&arr[begin], &arr[i]);      
        QuickSort(arr, maxlen, begin, i);  
        QuickSort(arr, maxlen, j, end);  
    }  
}  
 
void swap(int *a, int *b)    
{  
    int temp;  
    temp = *a;  
    *a = *b;  
    *b = temp;  
} 

void Heapify(int *arr, int m, int size)  
{  
    int i, tmp;  
    tmp = arr[m];  
    for (i = 2 * m; i <= size; i *= 2) {  
        if (i + 1 <= size && arr[i] < arr[i+1]) {  
            i++;  
        }  
        if (arr[i] < tmp) {  
            break;  
        }  
        arr[m] = arr[i];  
        m = i;  
    }  
    arr[m] = tmp;  
}  
  
void BulidHeap(int *arr, int size)
{  
    int i;  
    for (i = size / 2; i > 0; i--) {  
        Heapify(arr, i, size);  
    }  
}  
    
void swap2(int *arr, int i, int j)  
{  
    int tmp;  
    tmp = arr[i];  
    arr[i] = arr[j];  
    arr[j] = tmp;  
}  
/*堆排序*/
void HeapSort(int *arr, int size)  
{  
    int i;  
    BulidHeap(arr, size);  
    for (i = size; i > 1; i--) {  
        swap2(arr, 1, i);
        Heapify(arr, 1, i - 1);
    }  
}  
/*计数排序*/
void CountSort(int data[],int n)
{
    int i,j,count,*data_p;
    data_p=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)//初始化data_p
        data_p[i]=0;
    for(i=0;i<n;i++)
    {
        count=0;
        for(j=0;j<n;j++)//扫描待排序数组
            if(data[j]<data[i])//统计比data[i]值小的值的个数
                count++;
        while(data_p[count]!=0)//对于相等非0的数据,应向后措一位。数据为0时,因数组data_p被初始化为0,故不受影响。
        /* 注意此处应使用while循环进行判断,若用if条件则超过三个重复值后有0出现 */    
                count++;
        data_p[count]=data[i];//存放到data_p中的对应位置
    }
        //用于检查当有多个数相同时的情况
    i=0,j=n;
    while(i<j)
        {
        if(data_p[i]==0)
                {
            int temp=i-1;
            data_p[i]=data_p[temp];
        }//of if
        i++;
    }//of  while
    for(i=0;i<n;i++)//把排序完的数据复制到data中
        data[i]=data_p[i];
    free(data_p);//释放data_p
}
/*桶排序*/
void bucketSort(int *arr, int size)
{
    int i,j;
    int buckets[size];
    memset(buckets, 0, size * sizeof(int));
    for (i = 0; i < size; i++) {
        buckets[arr[i]]++; 
    }
    for (i = 0, j = 0; i < size; i++) {
        while((buckets[i]--) >0)
            arr[j++] = i;
    }
}
int get_index(int num, int dec, int order)
{
    int i, j, n;
    int index;
    int div;
    for (i = dec; i > order; i--) {
        n = 1;
        for (j = 0; j < dec - 1; j++)
            n *= 10;
        div = num / n;
        num -= div * n;
        dec--;
    }
    n = 1;
    for (i = 0; i < order - 1; i++)
        n *= 10;
    index = num / n;
    return index;
}
/*基数排序*/
void RadixSort(int *arr, int len, int dec, int order)
{
    int i, j;
    int index; 
    int tmp[len]; 
    int num[10];
    memset(num, 0, 10 * sizeof(int)); 
    memset(tmp, 0, len * sizeof(int));
 
    if (dec < order) {
        return;
    }
    for (i = 0; i < len; i++) {
        index = get_index(arr[i], dec, order);
        num[index]++; 
    }
 
    for (i = 1; i < 10; i++) {
        num[i] += num[i-1];
    }
    for (i = len - 1; i >= 0; i--) {
        index = get_index(arr[i], dec, order); 
        j = --num[index]; 
        tmp[j] = arr[i]; 
    }
 
    for (i = 0; i < len; i++) {
        arr[i] = tmp[i]; 
    }
    RadixSort(arr, len, dec, order+1);
} 

  

原文地址:https://www.cnblogs.com/still-smile/p/11884577.html