算法:排序(c++语言实现)

插入排序

void InsertSort(int array[],int n)                //n为数组长度 
{
	for(int i=1;i<n;i++)
	{
		int key = array[i];                       //当前元素的值设为key
		while(i>0 && array[i-1]>key)              //当前元素之前的值比当前元素大
		{
			array[i] = array[i-1];                //元素右移
			i--;                                  //继续比较
		}
		array[i] = key;                           //将当前元素插入合适位置
	}
}

选择排序

public void selectSort()
	{
		for(int i=0;i<size-1;i++)
		{
			int min = i;                //假设此位置的元素是最小的
			for(int j=i+1;j<size;j++)   //向后面找到最小的元素
			{
				if(list[j] < list[min])
					min = j;
			}
			int temp = list[i];        //将最小的元素放到此位置
			list[i] = list[min];
			list[min] = temp;
		}
	}

冒泡排序

for(i=0;i<n-1;i++)
{
    for(j=0;j<n-i-1;j++)
    {
        if(a[j]>a[j+1])                             
        {
            int temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
        }
    }
}

归并排序

void Merge(int *a,int p, int q, int r)
{
    int n1 = q - p + 1;       //左部分的的元素个数
    int n2 = r - q;           //右部分
    int i, j, k;
    int *L = new int[n1+1];
    int *R = new int[n2+1];
    
	for(i=0;i<n1;i++)
        L[i]=a[p+i];               //P+i !!!!!!! 
    
	for(j=0;j<n2;j++)
        R[j]=a[q+j+1];
    
	L[n1]=MAX;
    R[n2]=MAX;
    for(i=0,j=0,k=p;k<=r;k++)
    {
        if(L[i]<=R[j])
            a[k]=L[i++];
        else
            a[k]=R[j++];
    }
 
    delete []L;
    delete []R;
}

void MergeSort(int array[],int left,int right)
{
	if(left<right)                             //条件是left<right
	{
		int mid = (left+right)/2;
		MergeSort(array,left,mid);
		MergeSort(array,mid+1,right);
		Merge(array,left,mid,right);
	}
} 


void MergeSort2(int *a, int p, int r)  
{  
    if ((r-p)>=50) // 小于50个数据的数组进行插入排序  
    {  
        int q = (p+r)/2;  
        MergeSort2(a, p, q);  
        MergeSort2(a, q+1, r);  
        Merge(a, p, q, r);  
    }else  
    {  
        InsertionSort(a+p, r-p+1);               //a+p为数组首地址,r-p+1为长度
    }  
}

希尔排序

   void shellSort(int[] list,int size)
	{
		for(int k = size/2;k>0;k/=2)         //确定间隔
		{
			for(int i=k;i<size;i+=k)         //类似插入排序
			{
				int key = list[i];
				while(i>0 && list[i-k] > key)
				{
					list[i] = list[i-k];
					i-=k;
				}
				list[i] = key;
			}
		}
	}

快速排序

int randomized_partition(int a[],int low,int high)
{
	int i,j,x;
	srand((int)time(NULL));                      //<cstdlib> <ctime>
	int k = rand()%(high - low + 1) + low;         //实现随机选取pivot
	swap(a[k],a[high]);
	x = a[high];
	i = low - 1;
	for(j=low;j<high;j++)
	{
		if(a[j]<=x)
		{
			i++;
			swap(a[i],a[j]);
		}
	}
	swap(a[i+1],a[high]);
	return i+1;
	
}
void QuickSort(int a[],int low,int high)
{
	if(low<high)
	{
		int i = partition(a,low,high);
		QuickSort(a,low,i-1);
		QuickSort(a,i+1,high);
	}
}

堆排序

void Heapify(int a[],int size,int i)               //此为堆最大堆的堆化 
{
	int l = 2*i+1;
	int r = 2*i+2;
	int largest = i;                               //假定父节点是最大的
	if(l<size && a[l]>a[i])largest = l;
	if(r<size && a[r]>a[largest])largest = r;
	if(largest != i)
	{
		swap(a[i],a[largest]);
		Heapify(a,size,largest);
	}
}
void Build_heap(int a[],int size)
{
	for(int i = size/2-1;i>=0;i--)
	{
		Heapify(a,size,i);
	}
}

void Heapsort(int a[],int size)
{
	Build_heap(a,size);
	for(int i=size-1;i>=1;i--)
	{
		swap(a[i],a[0]);
		Heapify(a,--size,0);
	}
}

计数排序

//计数排序
void countingSort(int a[], int n) 
{
	int maxNum = a[0];                          
	for (int i = 1; i < n; i++)
		if (a[i] > maxNum)maxNum = a[i];        //找到最大整数
	
	int c[maxNum + 1];
	memset(c, 0, sizeof(c));
	for (int i = 0; i < n; i++)
		c[a[i]]++;       						//统计每个元素有几个
	for (int i = 1; i <= maxNum; i++)
		c[i] += c[i - 1];   					//前缀和
	
	int b[n];									//反向填充
	for (int i = n - 1; i >= 0; i--) 
	{	
		b[--c[a[i]]] = a[i];
		//b[c[a[i]] - 1] = a[i];
		//--c[i];
	}
	
	memcpy(a, b, sizeof(int)*n);    			//复制回去
}

奇偶排序

void Odd_even_sort(int a[],int size)
{
    bool sorted = false;
    while(!sorted)
    {
        sorted = true;
        for(int i=0;i<size-1;i+=2)
        {
            if(a[i]>a[i+1])
            {
                swap(a[i],a[i+1]);
                sorted = false;
            }
        }
        for(int i=1;i<size-1;i+=2)
        {
             if(a[i]>a[i+1])
            {
                swap(a[i],a[i+1]);
                sorted = false;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值