• 快速排序、插入排序、归并排序


    #include <iostream>
    #include <vector>
    #include <stack>
    using namespace std;
    
    //插入排序
    void inertsort(int *a,int n)
    {
    	int i,j,temp;
    	for(i =1;i < n;i++)
    	{
    		j = i;
    		while(j > 0&& a[j] < a[j-1])  //插入的值需要与原先序列中的值依次比较大小
    		{
    			temp = a[j];
    			a[j] = a[j-1];
    			a[j-1] = temp;
    			j--;
    		}
    	}
    }
    
    //快速排序
    void quicksort(int *a,int low, int high)
    {
    	int key = a[low];
    	int i = low;
    	int j = high;
    	while(i < j)
    	{
    		if(i < j)
    		{
    			while(i < j&&a[j] >= key) //从后往前寻找第一个小于key的值
    			{
    				j--;
    			}
    			if(i < j)
    			{
    				a[i] = a[j];
    				i += 1;
    				while(i<j&&a[i]<= key) //从前往后寻找第一个大于Key的值
    				{
    					i++;
    				}
    				if(i <j)
    				{
    					a[j] = a[i];
    					j--;
    				}
    
    			}
    		}
    	}
    	a[i] = key;
    	if(low < i-1) quicksort(a,low,i-1);
    	if(j+1< high) quicksort(a,j+1,high);
    }
    
    //归并排序
    void merge(int *a, int low,int mid,int high,int *c) //将a[low:mid]数组和a[mid+1,high]数组合并到数组c中
    {
    	int k = 0;
    	int idxa = low,idxb = mid +1;
    	while(idxa <= mid && idxb <= high)
    	{
    		if(a[idxa] <= a[idxb])
    		{
    			c[k++] = a[idxa++];
    		}
    		else
    		{
    			c[k++] = a[idxb++];
    		}
    	
    	}
    	while(idxa <= mid) //如果a[low:mid]数组有剩余,则说明剩余的值都比a[mid+1,high]大
    	{
    		c[k++] = a[idxa++];
    	}
    	while(idxb <= high) //同上
    	{
    		c[k++] = a[idxb++];
    	}
    	for(int i =0; i < k; i++) //最后将值赋给数组a,由于每次low的起始位置不定,不始终为0
    	{
    		a[low+i] = c[i];
    	}
    }
    void mergesort(int *a,int low,int high, int *c)//依次递归直到只有一个元素,此时有序
    {
    	int mid = 0;
    	if(low < high)
    	{
    		mid = (low + high)/2;
    		mergesort(a,low,mid,c); 
    		mergesort(a,mid+1,high,c);
    		merge(a,low,mid,high,c);
    	}
    
    }
    
    int main(void)  
    {  
    	int a[7] = {1,3,5,7,9,0,8};
    	int c[10] ={0} ;
    	mergesort(a,0,6,c);
    	for(int i=0;i<7;i++)
    	{
    		cout<<a[i];
    	}
    	return 0;  
    }
    

      其中插入排序和快速排序均属于内排序,而归并排序则是外排序,由于归并排序使用了外部内存,用空间换取了时间,所以归并排序的时间复杂度最坏和最好都为O(N*logN),快速排序最好为O(N*logN),最坏为O(N^2);

  • 相关阅读:
    Pytorch风格迁移代码
    手机配置IPV6
    风格迁移训练实践与分析
    linux下安装 nginx
    ubuntu18.04安装dockercompose
    windows配置GIT+SourceTree
    ubuntu18.04安装docker
    gitlab
    office visio 2019 下载激活
    宝塔+centos+django+nginx+uwsgi 配置网站
  • 原文地址:https://www.cnblogs.com/xqn2017/p/8021670.html
Copyright © 2020-2023  润新知