(15)十二种排序算法总结

花费了一天,复习了一下排序算法,写了下面的这个代码,也给大家分享一下,转载请转出处。

void selectsort(int[]);//选择排序
void insertsort(int[]);//插入排序
void bubblesort(int []);//冒泡排序
void shellsort(int []);//希尔排序
void shakersort(int []);//shaker排序
void creatminheap(int []);
void heapsort(int []);//堆排序
void quicksort(int s[], int l, int r);//快速排序
void mergearray(int a[], int first, int mid, int last, int temp[]);//归并排序
void stl_heap(int[],int i);//STL库 heap堆排序
void c_qsort(int[],int i); //C库 快速排序
void c_sort(int [],int i);  //调用C库 sort函数排序
void RadixSort(int *array, int length);//基数排序

 

//http://blog.csdn.net/sunboyiris
#include "stdafx.h"
#include "iostream"
#include "time.h"
#include <algorithm>
using namespace std;
#define MAX 20000
#define SWAP(x,y) {int t;t=x;x=y;y=t;}
void selectsort(int[]);//选择排序
void insertsort(int[]);//插入排序
void bubblesort(int []);//冒泡排序
void shellsort(int []);//希尔排序
void shakersort(int []);//shaker排序
void creatminheap(int []);
void heapsort(int []);//堆排序
void quicksort(int s[], int l, int r);//快速排序
void mergearray(int a[], int first, int mid, int last, int temp[]);//归并排序
void stl_heap(int[],int i);//STL库 heap堆排序
void c_qsort(int[],int i); //C库 快速排序
void c_sort(int [],int i);  //调用C库 sort函数排序
void RadixSort(int *array, int length);//基数排序


 

 

//------------------------基数排序----------------------------//

//http://blog.csdn.net/sunboyiris

int AbsoluteValue(int value)
{
	return ((value >= 0) ? value : 0 - value);
}

int TenExponentiation(int exponent)
{
	int i, value = 1;
	for (i = 0; i < exponent; i++)
	{
		value *= 10;
	}
	return value;
}

/****链式队列的定义,用于箱排序中的装箱和收集过程*/

typedef struct tagQueueNode{
	int number;
	struct tagQueueNode *next;
} QueueNode;

typedef struct tagQueue{
	QueueNode *front, *rear;
} Queue;

int IsQueueEmpty(Queue *q)
{
	return (!q->front->next);
}

void EnQueue(Queue *q, int num)
{
	QueueNode *temp = (QueueNode *)malloc(sizeof(QueueNode));
	temp->number = num;
	temp->next = NULL;
	q->rear->next = temp;
	q->rear = temp;
}

int DeQueue(Queue *q)
{
	int num;
	QueueNode *temp = q->front->next;
	if (IsQueueEmpty(q))
	{
		exit(1);
	}
	num = temp->number;
	q->front->next = temp->next;
	if (q->rear == temp)
	{
		q->rear = q->front;
	}
	free(temp);
	return num;
}
#define BucketSort BinSort
void BinSort(int *array, int length, int bit)
{
	int i, j = 0;
	int key;
	int temp;
	Queue *queue[10];
	for (i = 0; i < 10; i++)
	{
		queue[i] = (Queue *)malloc(sizeof(Queue));
    	queue[i]->front = queue[i]->rear = (QueueNode *)malloc(sizeof(QueueNode));
    	queue[i]->front->next = NULL;
	}
	if (bit >= 0)
	{
		for (i = 0; i < length; i++)
		{
			key = (int)(AbsoluteValue(array[i]) / TenExponentiation(bit)) - (int)(AbsoluteValue(array[i]) / TenExponentiation(bit + 1)) * 10;
			EnQueue(queue[key], array[i]);
		}
		for (i = 0; i < 10; i++)
		{
			while (!IsQueueEmpty(queue[i]))
			{
				array[j++] = DeQueue(queue[i]);
			}
		}
	}
	else
	{
		for (i = 0; i < length; i++)
		{
			key = (array[i] >= 0) ? 1 : 0;
			EnQueue(queue[key], array[i]);
		}
		while (!IsQueueEmpty(queue[0]))
		{
			array[j++] = DeQueue(queue[0]);
		}
		for (i = 0; i < (int)(j / 2); i++)
		{
			temp = array[i];
			array[i] = array[j-i-1];
			array[j-i-1] = temp;
		}
		while (!IsQueueEmpty(queue[1]))
		{
			array[j++] = DeQueue(queue[1]);
		}
	}
	for (i = 0; i < 10; i++)
	{
		free(queue[i]);
	}
}
void RadixSort(int *array, int length)
{
	int i;
	int max = 0, key_num = 0;
	for (i = 0; i < length; i++)
	{
		if (AbsoluteValue(array[i]) > max)
		{
			max = array[i];
		}
	}	
	while ((int)(AbsoluteValue(max) / TenExponentiation(key_num)) >= 10)
	{
		key_num++;
	}
	for (i = 0; i <= key_num; i++)
	{
		BinSort(array, length, i);
	}
	BinSort(array, length, -1);
}

//------------------------C库 sort函数快速排序----------------------------//
void c_sort(int num[],int i)
{
	sort(num,num+i);
}
//------------------------C库 qsort函数快速排序----------------------------//
int cmp(const void *a,const void *b)
{
 return *(int*)a-*(int*)b;
}
void c_qsort(int num[],int i)
{
qsort(num,i,sizeof(int),cmp);
}

//------------------------STL库 堆排序----------------------------//
void stl_heap(int num[],int i)
{
make_heap(num, num + i);
sort_heap(num, num + i);
}

//------------------------快速排序----------------------------//
void quicksort(int s[], int l, int r)
{
	//s[l]---s[r];
	if (l < r)
	{
		int i = l, j = r, x = s[l];
		while (i < j)
		{
			while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
				j--;  
			if(i < j) 
				s[i++] = s[j];

			while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
				i++;  
			if(i < j) 
				s[j--] = s[i];
		}
		s[i] = x;
		quicksort(s, l, i - 1); // 递归调用 
		quicksort(s, i + 1, r);
	}
}


//------------------------归并排序----------------------------//
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
	int i = first, j = mid + 1;
	int m = mid,   n = last;
	int k = 0;

	while (i <= m && j <= n)
	{
		if (a[i] < a[j])
			temp[k++] = a[i++];
		else
			temp[k++] = a[j++];
	}

	while (i <= m)
		temp[k++] = a[i++];

	while (j <= n)
		temp[k++] = a[j++];

	for (i = 0; i < k; i++)
		a[first + i] = temp[i];
}


void mergesort(int a[], int first, int last, int temp[])
{
	if (first < last)
	{
		int mid = (first + last) / 2;
		mergesort(a, first, mid, temp);    //左边有序
		mergesort(a, mid + 1, last, temp); //右边有序
		mergearray(a, first, mid, last, temp); //再将二个有序数列合并
	}
}
bool MergeSort(int a[], int n)
{
	int *p = new int[n];
	if (p == NULL)
		return false;
	mergesort(a, 0, n - 1, p);
	return true;
}
//------------------------堆排序----------------------------//
// creatminheap(num);
//heapsort(num);
void creatminheap(int num[])
{
	int i,s,p;
	int heap[MAX+1]={-1};
	for(i=1;i<=MAX;i++)
	{
	heap[i]=num[i];
	s=i;
	p=i/2;
	while((s>=2)&&(heap[p]>heap[s]))
	{
		SWAP(heap[p],heap[s]);
		s=p;
		p=s/2;
	}
	}
	for(i=1;i<MAX;i++)
		num[i]=heap[i];

}
void heapsort(int num[])
{
int i,j,p,s;
j=MAX;
while(j>1)
{

SWAP(num[1],num[j]);
j--;
 p=1;
 s=2*p;
 while(s<=j)
 {
 if((s<j)&&(num[s+1]<num[s]))
	 s++;
 if(num[p]<=num[s])
	 break;
 SWAP(num[p],num[s]);
 p=s;
 s=2*p;
 }
}
}

//------------------------shaker排序----------------------------//
void shakersort(int num[])
{
  int i, left=0,right=MAX-1,k=0;
  while(left<right)
  {
  //向右起泡排序
  for(i=left;i<right;i++)
  {
  if(num[i]>num[i+1])
  {SWAP(num[i],num[i+1]);k=i;}
  }
  right=k;

  //向左气泡排序
  for(i=right;i>left;i--)
  {
  if(num[i]<num[i-1])
  {SWAP(num[i],num[i-1]);k=i;}
  }
  left=k;
  }
}
//------------------------shell排序----------------------------//
void shellsort(int num[])
{
	int i,j,k,t,gap;
	gap=MAX/2; //间隔区间  排序
	while(gap>0)
	{
	for(k=0;k<gap;k++)
	{	for(i=k+gap;i<MAX;i+=gap)
	 {		for(j=i-gap;j>=k;j-=gap)
	   {		if(num[j]>num[j+gap])
				{SWAP(num[j],num[j+gap]);}
				else
     			{break;}
        }
	  }
	}
	gap/=2;
	}
}
//------------------------冒泡排序----------------------------//
void bubblesort(int num[])
{
	int i,j,k,f=1;
    for(i=0;(i<MAX-1)&&(f==1);i++)
	{
	f=0;
	for(j=0;j<MAX-i-1;j++)
	{
	if(num[j+1]<num[j])
	{
	SWAP(num[j+1],num[j]);
	f=1;
	}	
	}
	}
}
//------------------------选择排序----------------------------//
void selectsort(int num[])
{
	int i,j,m;
	for(i=0;i<MAX-1;i++)\
	{	m=i;
	for(j=i+1;j<MAX;j++)
	{	if(num[j]<num[m])
			m=j;
	    if(i!=m)
			SWAP(num[i],num[m]);
	}
	}
}
//------------------------插入排序----------------------------//
void insertsort(int num[])
{
int i,j,k,t;
for(j=1;j<MAX;j++)
{
  t=num[j];
  i=j-1;
  while(t<num[i])
  {
	  num[i+1]=num[i];
	  i--;
	  if(i<0)
		  break;
  }
  num[i+1]=t;
}
}


 

 

int _tmain(int argc, _TCHAR* argv[])
{
	int num[MAX]={0};
int num1[MAX]={0};
int num2[MAX]={0};
	int i;
	srand(time(NULL));

	 clock_t ibegin, iend;
    
	for(i=0;i<MAX;i++)
	{	
		num1[i]=rand()%100;
	}
    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("选择排序:  ");
	ibegin = clock();
	selectsort(num);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);
    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("插入排序:  ");
	ibegin = clock();
	insertsort(num);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);


	for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
    printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("冒泡排序:  ");
	ibegin = clock();
	bubblesort(num);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);
    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("希尔排序:  ");
	ibegin = clock();
	shellsort(num);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);
    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("shaker排序:  ");
	ibegin = clock();
	shakersort(num);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);


    for(i=0;i<MAX;i++)
	{	
		num2[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("堆排序:  ");
	ibegin = clock();
	creatminheap(num2);
	heapsort(num2);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);
   
	
    for(i=0;i<MAX;i++)
	{	
		num2[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("快速排序:  ");
	ibegin = clock();
	quicksort(num2,0,MAX-1);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);


    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}

	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("希尔排序:  ");
	ibegin = clock();
	MergeSort(num,MAX);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);

   for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("STL 堆排序:  ");
	ibegin = clock();
	stl_heap(num,MAX);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);
for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	/*void mergearray(int a[], int first, int mid, int last, int temp[]);//归并排序
void stl_heap(int[],int i);//STL库 heap堆排序
void c_qsort(int[],int i); //C库 快速排序
void c_sort(int [],int i);  //调用C库 sort函数排序
void RadixSort(int *array, int length);//基数排序
*/
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("C qsort排序:  ");
	ibegin = clock();
	c_qsort(num,MAX);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);



    for(i=0;i<MAX;i++)
	{	
		num[i]=num1[i];
	}
	printf("--当前数据量为%d--By vicent(http://blog.csdn.net/sunboyiris)--\n", MAX);
	printf("基数 排序:  ");
	ibegin = clock();
	RadixSort(num,MAX);
	iend = clock();
	printf("%d毫秒\n", iend - ibegin);

	

    // quicksort(num,0,MAX-1);
    // MergeSort(num,MAX);
	//stl_heap(num,MAX);
	//c_sort(num,MAX);
	//c_qsort(num,MAX);
	//RadixSort(num,MAX);
	//for(i=MAX-1;i>=0;i--)
	//{	cout<<num[i]<<" ";}
	return 0;
}


 




posted on 2013-11-21 16:26  love so much  阅读(309)  评论(0编辑  收藏  举报

导航