排序算法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>

#include "sort.h"

/*插入排序*/
void insert_sort(int data[], int len)
{
 int i   = 0;
 int j   = 0;
 int key = 0;

 for (i = 1; i < len; i ++)
 {
  key = data[i];
  j   = i - 1;

  while (j >= 0 && data[j] > key)
  {
   data[j + 1] = data[j];
   j --;
  }

  data[j + 1] = key;
 }
}

/*shell排序*/
void shell_sort(int data[], int len)
{
 int temp = 0;
 int i, j;

 for (int increment = len / 2; increment > 0; increment /= 2)
  for (i = increment; i < len; ++ i)
  {
   temp = data[i];

   for (j = i; j >= increment; j -= increment)
    if (temp < data[j - increment])
     data[j] = data[j - increment];
    else
     break;

   data[j] = temp;
  }
}

/*冒泡排序*/
void bubble_sort(int data[], int len)
{
 int i, j;
 int exchange = 0;
 int tmp;

 for (i = 0; (i < len) && (!exchange); ++ i)
 {
  exchange = 1;

  for (j = i + 1; j < len; ++ j)
  {
   if (data[j] < data[i])
   {
    tmp         = data[j];
    data[j]     = data[i];
    data[i]     = tmp;

    exchange = 0;
   }
  }

 }
}

void swap_data(int &a, int &b)
{
 a  = a + b;
 b  = a - b;
 a  = a - b;
}

int partition_data(int data[], int low, int high)
{
 int pivot = data[low];

 while (low < high)
 {
  while(low < high && data[high] >= pivot)
   -- high;

  swap_data(data[low], data[high]);

  while(low < high && data[low] <= pivot)
   ++ low;

  swap_data(data[low], data[high]);
 }

 return low;
}

/*快速排序*/
void quick_sort(int data[], int p, int r)
{
 if (p < r)
 {
  int n = partition_data(data, p, r);
  quick_sort(data, p, n);
  quick_sort(data, n + 1, r);
 }
}

void merge_data(int data[], int p, int q, int r)
{
 int  i, j, k;
 int  n = q - p + 1;
 int  m = r - q;
 int  *pDataL = (int *)malloc(sizeof(int) * n);
 int  *pDataR = (int *)malloc(sizeof(int) * m);

 for (i = 0; i < n; ++ i)
  pDataL[i] = data[p + i];

 for (i = 0; i < m; ++ i)
  pDataR[i] = data[q + i + 1];

 for (k = p, i = 0, j = 0; k <= r && i < n && j < m; ++ k)
  if (pDataL[i] <= pDataR[j])
   data[k] = pDataL[i ++];
  else
   data[k] = pDataR[j ++];                                       

 while (i < n)
  data[k ++] = pDataL[i ++];

 while (j < m)
  data[k ++] = pDataR[j ++];

 free(pDataL);
 free(pDataR);
}

/*归并排序*/
void merge_sort(int data[], int p, int r)
{
 int q;

 if (p < r)
 {
  q = (p + r) / 2;
  merge_sort(data, p, q);
  merge_sort(data, q + 1, r);
  merge_data(data, p, q, r);
 }
}

/*简单选择排序*/
void select_sort(int data[], int len)
{
 int i, j, m;
 int tmp = 0;

 for(i = 0; i < len - 1; i ++)
 {
  m = i;

  for (j = i + 1; j < len; j ++)
   if (data[j] < data[m])
    m = j;

  if (i != m)
  {
   tmp     = data[i];
   data[i] = data[m];
   data[m] = tmp;
  }
 }
}

/*记数排序*/
void count_sort(int data[], int len)
{
 int i, min, max;

 min = max = data[0];

 for (i = 1; i < len; ++ i)
 {
  if (data[i] < min)
   min = data[i];
  else if(data[i] > max)
   max = data[i];
 }

 int range = max - min + 1;
 int *count = (int *)malloc(range * sizeof(int));

 for(i = 0; i < range; i++)
  count[i] = 0;

 for(i = 0; i < len; i++)
  count[data[i] - min ]++;

 int j, z = 0;
 for(i = min; i <= max; i++)
  for(j = 0; j < count[ i - min ]; j++)
   data[z++] = i;

 free(count);
}

/*鸡尾酒排序*/
void cocktail_sort(int data[], int len)
{
 int  bottom = 0;
 int  top = len - 1;
 bool swapped = 1;
 
 while (swapped == 1)
 {
  swapped = 0;

  for (int i = bottom; i < top; i ++)
  {
   if (data[i] > data[i + 1])
   {
    swap_data(data[i], data[i + 1]);
    swapped = 1;
   }
  }

  top --;
  for (int i = top; i > bottom; i --)
  {
   if (data[i] < data[i - 1])
   {
    swap_data(data[i], data[i - 1]);
    swapped = 1;
   }
  }

  bottom ++;
 }
}

/*奇偶排序*/
void oddevent_sort(int data[], int len)
{
 bool sorted = 0;

 while (!sorted)
 {
  sorted = 1;

  for (int i = 1; i < len - 1 ; i += 2)
  {
   if (data[i] > data[i + 1])
   {
    swap_data(data[i] ,data[i + 1]);
    sorted = 0;
   }
  }

  for (int j = 0; j < len - 1; j += 2)
  {
   if (data[j] > data[j + 1])
   {
    swap_data(data[j] ,data[j + 1]);
    sorted = 0;
   }
  }
 }
}

void sift(int data[], int startIndex, int Length)
{
 while(2 * startIndex + 1 < Length)
 {
  int childIndex = 2 * startIndex + 1;

  if(2 * startIndex + 2 < Length)
  {
   if(data[2 * startIndex + 1]<data[2 * startIndex + 2])
    childIndex = 2 * startIndex + 2;
  }
  if(data[startIndex] < data[childIndex])
  {
   swap_data(data[startIndex],data[childIndex]);
   startIndex = childIndex ;
  }
  else
   break;
 }

 return;
}

/*堆排序*/
void heap_sort(int data[], int Length)
{
 int i = 0;

 for (i = Length / 2 - 1; i >= 0; i --)
  sift(data, i, Length);

 for (i = Length - 1; i > 0; i --)
 {
  swap_data(data[0],data[i]);
  sift(data, 0, i);
 }
}

int radix_count_sort(int* npIndex, int nMax, int* npData, int nLen)
{
 int* pnCount  = (int*)malloc(sizeof(int)* nMax);     
 int * pnSort  = (int*)malloc(sizeof(int) * nLen);  

 for (int i = 0; i < nMax; ++i)
  pnCount[i] = 0;

 for (int i = 0; i < nLen; ++i)   
  ++pnCount[npIndex[i]];

 for (int i = 1; i < 10; ++i) 
  pnCount[i] += pnCount[i - 1];

 for (int i = nLen - 1; i >= 0; --i)
 {
  --pnCount[npIndex[i]];       
  pnSort[pnCount[npIndex[i]]] = npData[i];
 }

 for (int i = 0; i < nLen; ++i)      
  npData[i] = pnSort[i];

 free(pnSort);                     
 free(pnCount);

 return 1;
}

/*基数排序*/
int radix_count(int data[], int nLen)
{
 int* nDataRadix  = (int*)malloc(sizeof(int) * nLen);

 int nRadixBase = 1;     
 bool nIsOk     = false; 

 while (!nIsOk)
 {
  nIsOk = true;
  nRadixBase *= 10;

  for (int i = 0; i < nLen; ++i)
  {
   nDataRadix[i] = data[i] % nRadixBase;
   nDataRadix[i] /= nRadixBase / 10;

   if (nDataRadix[i] > 0)
    nIsOk = false;
  }
  if (nIsOk)       
   break;

  radix_count_sort(nDataRadix, 10, data, nLen);
 }

 free(nDataRadix);

 return 1;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值