排序原始数据[置顶] 各种常见排序算法实现
本篇文章朋友在上海游玩的时候突然想到的...这段时间就有想写几篇关于排序原始数据的博客,所以回家到之后就奋笔疾书的写出来发布了
将各种见常排序法算简略实现了一下,包含:1、简略插入排序;2、冒泡排序;3、简略选择排序;4、快速排序;5、希尔排序;6、堆排序
    #include<stdio.h>
 #include<stdlib.h>
 #include<time.h>
 
 #define LEN 10
 
 //初始化组数
 void init(int arr[], int len);
 //打印组数元素
 void print(int arr[], int len);
 //打印堆元素
 void printH(int arrH[], int len);
 //交换两个数整的值
 void swap(int & a, int & b);
 //简略插入排序
 void insertSort(int arr[], int len);
 //冒泡排序
 void bubbleSort(int arr[], int len);
 //简略选择排序
 void selectSort(int arr[], int len);
 //返回快排枢轴下标
 int partion(int arr[], int low, int high);
 //快速排序
 void quickSort(int arr[], int low, int high);
 //堆整调
 void heapAjust(int arrH[], int s, int m);
 //堆排序
 void heapSort(int arrH[],int len);
 //希尔排序
 void shellSort(int arr[], int len);
 
 
 int main()
 {
     int arr[LEN];
     //堆排序用,arrH[0]做临时量变用使
     int arrH[LEN+1];
     srand((unsigned)time(NULL));
     //简略插入排序
     init(arr,LEN);
     printf("\n原始数据:");
     print(arr,LEN); 
     printf("插入排序后:");
     insertSort(arr,LEN);
     print(arr,LEN);
     //冒泡排序
     init(arr,LEN);
     printf("\n原始数据:");
     print(arr,LEN);
     printf("冒泡排序后:");
     bubbleSort(arr,LEN);
     print(arr,LEN);
     //简略选择排序
     init(arr,LEN);
     printf("\n原始数据:");
     print(arr,LEN);
     printf("简略选择排序后:");
     selectSort(arr,LEN);
     print(arr,LEN);
     //快速排序
     init(arr,LEN);
     printf("\n原始数据:");
     print(arr,LEN);
     printf("快速排序后:");
     quickSort(arr,0,LEN);
     print(arr,LEN);
     //希尔排序
     init(arr,LEN);
     printf("\n原始数据:");
     print(arr,LEN);
     printf("希尔排序后:");
     shellSort(arr,LEN);
     print(arr,LEN);
     //对排序
     init(arrH,LEN+1);
     arrH[0] = 100;//将第一个元素初始化为0
     printf("\n原始数据:");
     printH(arrH,LEN+1);
     printf("堆排序后:");
     heapSort(arrH,LEN);
     printH(arrH,LEN+1);
 
     return 0;
 }
 
 //初始化组数
 void init(int arr[], int len)
 {
    int i;
    for (i = 0; i< len; i++)
    {
        arr[i] = rand() % 1000;
    }
 }
 
 //打印组数元素
 void print(int arr[], int len)
 {
    int i;
    printf("\n");
    for (i = 0; i < len; i++)
        printf("%d    ",arr[i]);
    printf("\n");
 }
 //打印堆元素
 void printH(int arrH[], int len)
 {
    int i;
    printf("\n");
    for (i = 1; i < len; i++)
        printf("%d    ",arrH[i]);
    printf("\n");
 }
 //交换两个数整的值
 void swap(int & a, int & b)
 {
     a = a ^ b;
     b = a ^ b;
     a = a ^ b;
 }
 //简略插入排序
 void insertSort(int arr[], int len)
 {
     int i,j,temp;
     for (i = 1; i < len; i++)
     {
         temp = arr[i];
         for(j = i - 1; j >= 0 && arr[j] > temp; j--)
             arr[j+1] = arr[j];
         arr[j+1] = temp;
     }      
 }
 //冒泡排序
 void bubbleSort(int arr[], int len)
 {
     int i,j,exchange;
     exchange = 0;
     for (i = 0; i < len - 1; i++)
     {
         for (j = 0; j < len - i - 1; j++)
         {
             if (arr[j] > arr[j+1])
           {
                 swap(arr[j],arr[j+1]);
                 exchange = 1;
             }
         }
         //如果没交换元素,说明已排好序
         if (!exchange)
         {
             break;
         }
     }
 }
 //简略选择排序
 void selectSort(int arr[], int len)
 {
     int i,j,temp;
     for (i = 0; i < len - 1; i++)
     {
         temp = i;
         for (j = i + 1; j < len; j++)
         {
             if (arr[j] < arr[temp])
             {
                 temp = j; 
             }
         }
         if (temp != i)
         {
             swap(arr[temp],arr[i]);
         }
     }
         
 }
 //返回快排枢轴下标
 int partion(int arr[], int low, int high)
 {
     int temp;
     temp = arr[low];
     while (low < high)
     {
         while (low < high && arr[high] >= temp)
             high--;
         arr[low] = arr[high];
         while (low < high && arr[low] <= temp)
             low++;
         arr[high] = arr[low];
     }
     arr[low] = temp;
     return low;
 }
 //快速排序
 void quickSort(int arr[], int low, int high)
 {
     if (low > high || low < 0 || high < 0)
     {
         return;
     } 
 
     if (low < high)
     {
     int mid = partion(arr,low,high);
         quickSort(arr,low,mid - 1);
         quickSort(arr,mid + 1,high); 
     }         
 }
 //堆整调,大堆
 void heapAjust(int arrH[], int s, int m)
 {
     int temp = arrH[s];
     int i;
     for (i = 2 * s; i <= m; i *= 2)
     {
         if ((i < m) && (arrH[i] < arrH[i+1]))
            i++;
         if(arrH[i] <= temp)
            break;
         arrH[s] = arrH[i];
         s = i;
     }
     arrH[s] = temp; 
 }
 //堆排序
 void heapSort(int arrH[],int len)
 {
     int i;
     for (i = len / 2; i > 0; i--)
         heapAjust(arrH,i,len);
     for (i = len; i > 1; i--)
     {
         swap(arrH[1],arrH[i]);
         heapAjust(arrH,1,i - 1);
     }
 }
 //希尔排序
 void shellSort(int arr[], int len)
 {
  int h = 0;
  int i = 0;
  int j = 0;
  //设置步长
  for(h = 1; h < len; h = 3 * h + 1)
      ;
  while(h)
  {
      h /= 3;
      if(h < 1)
          break;
      for(i = h; i < len; i++)
         for(j = i; j >= h; j-=h)
         {
            if(arr[j-h] < arr[j])
               break;
            swap(arr[j-h],arr[j]);
         }
   }
 }
    
 
文章结束给大家分享下程序员的一些笑话语录: 
程序员的愿望
      有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
      上帝: 这个啊!这个不好办啊,你还说下一个吧!
      程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
      上帝: 还是让中国国家打进世界杯.
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号