zoukankan      html  css  js  c++  java
  • 序列插入常用排序算法 总结

    在写这篇文章之前,xxx已经写过了几篇关于改序列插入主题的文章,想要了解的朋友可以去翻一下之前的文章

        1. 直接插入排序

        2. 折半插入排序

        3. 冒泡排序

        4. 简略选择排序

        5. 希尔排序

        6. 快速排序

        7. 堆排序

        8. 二路归并排序

        

        每日一道理
    青春,有嬉笑声与哭泣声夹杂的年华,青春的少年是蓝天中翱翔的幼鹰,虽然没有完全长大,有些稚气,有些懵懂,脱不开父母的双手却极力想去找寻属于自己的一片天空,为的是一时的激情,为的是一种独自翱翔的感觉!
    // Sort.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "iostream"
    
    using namespace std;
    // Straight insert sort
    void InsertSort(int *arr,int length);
    void InsertSort2(int arr[], int length);
    
    // Binary Insert Sort
    void BinInsertSort(int arr[], int length);
    
    // Shell Sort
    void ShellSort(int *arr,int length);
    // Shell Sort 2
    void ShellSort2(int *arr,int length);
    
    // Bubble Sort
    void BubbleSort(int *arr,int length);
    
    // Quick Sort
    void QuickSort(int *arr, int low, int high);
    // Partition
    int Partition(int *arr, int low, int high);
    
    // Simple Selection Sort
    void SimpleSelectionSort(int *arr, int length);
    
    // HeapAdjust
    void HeapAdjust(int *arr, int s,int end);
    
    // Heap Sort,小根堆
    void HeapSort(int *arr,int length);
    // Merge Array
    void Merge(int *arr, int *arr2, int left, int mid, int right);
    // Merge Sort
    void MergeSort(int *arr, int *arr2, int left, int right);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int arr[]={29,5,44,28,36,42,7,5,88,9,10};
    	int length=sizeof(arr)/sizeof(*arr);
    	InsertSort(arr,length);
    	printf("Straight Insert Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr[i]);
    	}
    	cout<<endl;
    
    	// test2
    	int arr2[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr2)/sizeof(*arr2);
    	InsertSort2(arr2,length);
    	printf("Straight Insert Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr2[i]);
    	}
    	cout<<endl;
    
    	// test3
    	int arr3[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr3)/sizeof(*arr3);
    	BinInsertSort(arr3,length);
    	printf("Binary Insert Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr3[i]);
    	}
    	cout<<endl;
    
    	// test4
    	int arr4[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr4)/sizeof(*arr4);
    	ShellSort(arr4,length);
    	printf("Shell Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr4[i]);
    	}
    	cout<<endl;
    
    	// test5
    	int arr5[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr5)/sizeof(*arr5);
    	ShellSort2(arr5,length);
    	printf("Shell Sort 2:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr5[i]);
    	}
    	cout<<endl;
    
    	// test6
    	int arr6[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr6)/sizeof(*arr6);
    	BubbleSort(arr6,length);
    	printf("Bubble Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr6[i]);
    	}
    	cout<<endl;
    
    	
    
    	// test7
    	int arr7[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr7)/sizeof(*arr7);
    	QuickSort(arr7,0,length-1);
    	printf("Quick Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr7[i]);
    	}
    	cout<<endl;
    
    	// test8
    	int arr8[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr8)/sizeof(*arr8);
    	SimpleSelectionSort(arr8,length);
    	
    	printf("Simple Selection Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr8[i]);
    	}
    	cout<<endl;
    
    	// test9, 对于堆的应用,数组arr[0]临时不用,降低处置复杂度
    	int arr9[]={0,29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr9)/sizeof(*arr9)-1;
    	HeapSort(arr9,length);
    	printf("///////////////////////////////////////////////////////////////////////\n");
    	printf("Heap Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=length;i>=1;i--)
    	{
    		printf("%5d",arr9[i]);
    	}
    	cout<<endl;
    
    	// test10
    	int arr10[]={29,5,44,28,36,42,7,5,88,9,10};
    	length=sizeof(arr10)/sizeof(*arr10);
    	int * arr10_2=new int[length];
    	MergeSort(arr10,arr10_2,0,length-1);
    	printf("///////////////////////////////////////////////////////////////////////\n");
    	printf("Merge Sort:\n");
    	printf("total number:%4d\n",length);
    	printf("sorted result:\n");
    	for (int i=0;i<length;i++)
    	{
    		printf("%5d",arr10[i]);
    	}
    	cout<<endl;
    
    	system("pause");
    	return 0;
    }
    
    // 由小到大排序
    // Straight Insert Sort
    void InsertSort(int *arr,int length)
    {
    	for (int i=1;i<length;i++)
    	{
    		if (arr[i]<arr[i-1]) // 须要将arr[i]插入到已排序的列表中 
    		{
    			int temp=arr[i];
    			int j=0;
    			for (j=i-1;j>=0;j--)
    			{
    				if (temp<arr[j])
    				{
    					arr[j+1]=arr[j];
    				}
    				else
    				{
    					break;
    				}
    			}
    			arr[j+1]=temp;
    		}
    	}
    }
    
    // Straight Insert Sort 2
    void InsertSort2(int arr[], int length)
    {
    	for (int i=1;i<length;i++)
    	{
    		if (arr[i]<arr[i-1]) // 须要进行插入
    		{
    			int temp=arr[i];
    			int j=i-1;
    			do 
    			{
    				arr[j+1]=arr[j];
    				j--;
    			} while (j>=0&&temp<arr[j]);
    			arr[j+1]=temp;
    		}
    	}
    }
    
    // Binary Insert Sort
    void BinInsertSort(int arr[], int length)
    {
    	for (int i=1;i<length;i++)
    	{
    		if (arr[i]<arr[i-1]) // 须要插入到有序序列中
    		{
    			int temp=arr[i];
    			int low=0;
    			int high=i-1;
    			while(low<=high)
    			{
    				int mid=(low+high)/2;
    				if (temp<mid)
    				{
    					high=mid-1;
    				}
    				else if (temp>mid)
    				{
    					low=mid+1;
    				}
    				else
    				{
    					low=mid+1;
    					break;
    				}
    			}
    			for(int j=i-1;j>=low;j--)
    			{
    				arr[j+1]=arr[j];
    			}
    			arr[low]=temp;
    		}
    	}
    }
    
    // Shell Sort
    void ShellSort(int *arr,int length)
    {
    	// Shell Sort
    	int gap=length; // 初始化子序列的间隔
    	do 
    	{
    		gap=gap/3+1;
    		for (int i=0+gap;i<length;i++) //判断每个子序列 
    		{
    			if (arr[i]<arr[i-gap]) // 须要插入到已排序的子序列
    			{
    				int temp=arr[i];
    				int j=0;
    				for (j=i-gap;j>=0;j=j-gap)
    				{
    					if (temp<arr[j])
    					{
    						arr[j+gap]=arr[j];
    					}
    					else
    					{
    						break;
    					}
    				}
    				arr[j+gap]=temp;
    			}
    		}
    	} while (gap>1);
    }
    
    // Shell Sort 2
    void ShellSort2(int *arr,int length)
    {
    	int gap=length;
    	do 
    	{
    		gap=gap/3+1;
    		for (int i=0+gap;i<length;i++)
    		{
    			if (arr[i]<arr[i-gap])
    			{
    				int temp=arr[i];
    				int j=i-gap;
    				do 
    				{
    					arr[j+gap]=arr[j];
    					j=j-gap;
    				} while (j>=0&&temp<arr[j]);
    				arr[j+gap]=temp;
    			}
    		}
    	} while (gap>1);
    }
    
    // Bubble Sort
    void BubbleSort(int *arr,int length)
    {
    	bool exchange=false;
    	for (int i=0;i<length-1;i++)
    	{
    		exchange=false;
    		for (int j=length-1;j>=i+1;j--)
    		{
    			if (arr[j]<arr[j-1]) // 须要交换
    			{
    				exchange=true;
    				int temp=arr[j-1];
    				arr[j-1]=arr[j];
    				arr[j]=temp;
    			}
    		}
    		if (exchange==false)
    		{
    			return;
    		}
    	}
    }
    
    // Quick Sort
    void QuickSort(int *arr, int low, int high)
    {
    	if (low<high)
    	{
    		int pivocLoc=Partition(arr,low,high);
    		QuickSort(arr,low,pivocLoc-1);
    		QuickSort(arr,pivocLoc+1,high);
    	}
    }
    
    // Partition
    int Partition(int *arr, int low, int high)
    {
    	int pivotKey=arr[low]; // 记载枢轴
    	while(low<high)
    	{
    		while(low<high&&arr[high]>=pivotKey) --high;
    		int temp=arr[high];arr[high]=arr[low];arr[low]=temp;
    		while(low<high&&arr[low]<pivotKey) ++low;
    		temp=arr[high];arr[high]=arr[low];arr[low]=temp;
    	}
    	return low;
    }
    
    // Simple Selection Sort
    void SimpleSelectionSort(int *arr, int length)
    {
    	//
    	for (int i=0;i<length;i++)
    	{
    		int index=i;
    		for(int j=i+1;j<length;j++)
    		{
    			if (arr[j]<arr[index])
    			{
    				index=j;
    			}
    		}
    		if(index!=i)
    		{
    			// exchange
    			int temp=arr[i];
    			arr[i]=arr[index];
    			arr[index]=temp;
    		}
    	}
    }
    
    // Heap Sort,小根堆
    void HeapSort(int *arr,int length)
    {
    	// 调整数组生成小根堆
    	for (int i=length/2;i>=1;i--)
    	{
    		HeapAdjust(arr,i,length);
    	}
    	for (int i=length;i>1;--i)
    	{
    		// 交换堆头的元素和最后一个
    		int temp=arr[1];
    		arr[1]=arr[i];
    		arr[i]=temp;
    
    		// 重新调整堆为小根堆
    		HeapAdjust(arr,1,i-1);
    	}
    }
    
    // HeapAdjust
    void HeapAdjust(int *arr, int s,int end)
    {
    	int rloc=arr[s];
    	for (int j=2*s;j<=end;j=j*2)
    	{
    		if (j<end&&arr[j]>arr[j+1])
    		{
    			j++; // 找到两个兄弟节点中最小的节点
    		}
    		if (!(arr[j]<rloc))
    		{
    			break;
    		}
    		arr[s]=arr[j];
    		s=j;
    	}
    	arr[s]=rloc;
    }
    
    // Merge Sort
    void MergeSort(int *arr, int *arr2, int left, int right)
    {
    	if (left==right)
    	{
    		arr2[left]=arr[left];
    		return;
    	}
    	if (left<right)
    	{
    		int mid=(left+right)/2;
    		MergeSort(arr,arr2,left,mid);
    		MergeSort(arr,arr2,mid+1,right);
    		Merge(arr,arr2,left,mid,right);
    	}
    }
    
    // Merge Array
    void Merge(int *arr, int *arr2, int left, int mid, int right)
    {
    	// 将数组保存到暂存空间中
    	for (int k=left;k<=right;k++)
    	{
    		arr2[k]=arr[k];
    	}
    	int s1=left;
    	int s2=mid+1;
    	int t=left;
    	while(s1<=mid&&s2<=right)
    	{
    		if (arr2[s1]<=arr2[s2])
    		{
    			arr[t++]=arr2[s1++];
    		}
    		else
    		{
    			arr[t++]=arr2[s2++];
    		}
    	}
    	while(s1<=mid) arr[t++]=arr2[s1++];
    	while(s2<=right) arr[t++]=arr2[s2++];
    }

    文章结束给大家分享下程序员的一些笑话语录: 看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。

  • 相关阅读:
    autopoi升级到4.0版本修改方法
    JeecgBoot的前端Form升级为FormModel用法(支持 v-model 绑定)
    如何设计一张带二维码的打印报表?
    低代码概念报表-JimuReport1.1.09 版本发布
    分组报表怎么做,积木报表十分钟搞定!
    JeecgBoot 2.4.2 积木报表版本发布,基于SpringBoot的低代码平台
    低代码开发是如何解决企业招聘技术人才难题?
    JimuReport积木报表1.1.05 版本发布,免费的企业级 Web 报表工具
    Docker安装elasticsearch 7.7.0
    Jeecg 文件上传漏洞补丁说明
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3087243.html
Copyright © 2011-2022 走看看