常见排序算法(冒泡,选择,快速)的C语言实现

来源:互联网 发布:如何当好淘宝客服? 编辑:程序博客网 时间:2024/05/21 22:38

/*
** 常见排序算法比较 
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define N 10
#define Demo 1

void BubbleSort(int arr[], int n);
void SelectSort(int arr[], int n);
void QuickSort(int arr[], int n);
void PrintArray(int arr[], int n);
void GenerateArray(int arr[], int n);

int main(int argc, char *argv[])
{
    int arr[N];
        
    GenerateArray(arr, N); 
    #if Demo
    printf("Before the bubble sort------------------------\n");
    PrintArray(arr, N);
    #endif
    printf("Start Bubble sort----------------------\n");
    clock_t start_time1=clock(); //开始计时 
    BubbleSort(arr, N);
    clock_t end_time1=clock(); // 结束计时 
    printf("Running time is: %lf ms\n", (double)(end_time1-start_time1)/CLOCKS_PER_SEC*1000); //输出运行时间
    #if Demo
    printf("After the bubble sort------------------------\n");
    PrintArray(arr, N);
    #endif
    printf("-----------------------------------------------------------\n");
    
    sleep(1000); // 单位是毫秒即千分之一秒 
    GenerateArray(arr, N); 
    #if Demo
    printf("Before the selection sort------------------------\n");
    PrintArray(arr, N);
    #endif
    printf("Start selection sort----------------------\n");
    clock_t start_time2=clock(); //开始计时 
    SelectSort(arr, N);
    clock_t end_time2=clock(); // 结束计时 
    printf("Running time is: %lf ms\n", (double)(end_time2-start_time2)/CLOCKS_PER_SEC*1000); //输出运行时间
    #if Demo
    printf("After the selection sort------------------------\n");
    PrintArray(arr, N);
    #endif
    
    printf("-----------------------------------------------------------\n");
    sleep(1000); // 单位是毫秒即千分之一秒 
    GenerateArray(arr, N); 
    #if Demo
    printf("Before the quick sort------------------------\n");
    PrintArray(arr, N);
    #endif
    printf("Start quick sort----------------------\n");
    clock_t start_time3=clock(); //开始计时 
    QuickSort(arr, N);
    clock_t end_time3=clock(); // 结束计时 
    printf("Running time is: %lf ms\n", (double)(end_time3-start_time3)/CLOCKS_PER_SEC*1000); //输出运行时间
    #if Demo
    printf("After the quick sort------------------------\n");
    PrintArray(arr, N);
    #endif
  
  system("PAUSE"); 
  return 0;
}

// 产生随机列表 
void GenerateArray(int arr[], int n)
{
     int i;
     srand((unsigned)time(0));
     
     for(i = 0; i <N; i++) 
     {
          arr[i] = rand(); // 生成随机数 范围在0-32767之间 
     }
}

// 打印列表 
void PrintArray(int arr[], int n)
{
     int i = 0;
     for(i = 0; i < n; i++)
           printf("%6d", arr[i]);
     printf("\n");
}

// 经典冒泡排序 
void BubbleSort(int arr[], int n)
{
     int i = 0, j =0;     
     for(i = 0; i < n; i++)
       for(j = 0; j < n - 1 - i; j++)
       {
             if(arr[j] > arr[j + 1])
             {
                       arr[j] = arr[j] ^ arr[j+1];
                       arr[j+1] = arr[j] ^ arr[j+1];
                       arr[j] = arr[j] ^ arr[j+1];
             }             
       }     
}

// 快速排序的递归实现 
void QuickSort(int arr[], int n)
{
     if(n <= 1)
     return;
     
     int i =0 , j = n - 1;
     int key = arr[0];
     int index = 0;
     
     while(i < j)
     {
             // 从后向前搜索 
             while(j > i && arr[j] > key)
             j--;
             if(j == i)
             break;
             else
             {
                 //交换 a[j] a[i]
                 arr[j] = arr[j] ^arr[i];
                 arr[i] = arr[j] ^arr[i];
                 arr[j] = arr[j] ^arr[i];
                 index = j;
             }
             
             // 从前向后搜索
             while(i < j && arr[i] <key)
             i++;
             if(i == j)
             break;
             else
             {
                 // 交换 a[i] a[j] 
                 arr[j] = arr[j] ^arr[i];
                 arr[i] = arr[j] ^arr[i];
                 arr[j] = arr[j] ^arr[i];
                 index = i;
             }             
     }     
     QuickSort(arr, index);
     QuickSort(arr + index + 1, n - 1 - index);
}

// 选择排序 
void SelectSort(int arr[], int n)
{
     int i, j;
     int min;
     
     for(i = 0; i < n - 1; i++)
     {
           int index = 0;
           min = arr[i];
           for(j = i + 1; j < n; j++) //找出 i+1 - n 无序区的最小者与arr[i]交换 
           {
                 if(arr[j] < min)
                 {
                    min = arr[j];
                    index = j;      
                 }   
           }
           if(index != 0) //表明无序区有比arr[i]小的元素
           {
               arr[i] = arr[i]^arr[index];
               arr[index] = arr[i]^arr[index];
               arr[i] = arr[i]^arr[index];
           } 
     }
}

 转载:http://www.cnblogs.com/herbert/archive/2011/01/20/1940392.html

原创粉丝点击