zoukankan      html  css  js  c++  java
  • 十大排序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);
    } 
    

      

  • 相关阅读:
    【转】linux之fsck命令
    【转】linux之mkfs/mke2fs格式化
    【转】linux_fdisk命令详解
    【转】linux之ln命令
    [转]linux的du和df命令
    [转]Linux之type命令
    [转]Linux下which、whereis、locate、find 命令的区别
    [转]Linux的chattr与lsattr命令详解
    get 与post 的接收传值方式
    在asp.net前台页面中引入命名空间 和连接数据库
  • 原文地址:https://www.cnblogs.com/still-smile/p/11884577.html
Copyright © 2011-2022 走看看