几种排序方法的实现(更新中)

插入排序:

1).直接插入排序:

  假设当前排序到了第i个元素arr[i],则此时i左侧[0,i-1]已经有序,对于arr[i]来说,如果arr[i]>=arr[i-1],则不用排序,直接进入[i+1];否则要在左侧有序表中找到一个合适的位置j令arr[j]<=arr[i]<arr[j+1]。

每一趟插入排序,令当前有序表的长度增加1,直至有序长度等于数组长度。

class Solution {
public:
	void InsertSort(vector<int>& arr){
		if(arr.empty())
			return;
		for(int i=1;i<arr.size();i++)
		{
			if(arr[i]<arr[i-1])
			{
				int tmp=arr[i];
				arr[i]=arr[i-1];
				int j=i-2;
				for(;j>=0&&arr[j]>tmp;j--)
					arr[j+1]=arr[j];
				arr[j+1]=tmp;
			}
		}
		return;
    }
};

2).折半插入排序:

  和普通的直接插入排序相比,折半插入排序利用了左侧有序表的特性,利用折半查找减少了查询次数,但移动次数仍然未改变。

class Solution {
public:
	void BInsertSort(vector<int>& arr){
		if(arr.empty())
			return;
		for(int i=1;i<arr.size();i++)
		{
			int low=0,high=i-1;
			while(low<=high)
			{
				int mid=(low+high)/2;
				if(arr[mid]>arr[i])
					high=mid-1;
				else
					low=mid+1;
			}
			int tmp=arr[i];
			for(int j=i-1;j>=high+1;j--)
				arr[j+1]=arr[j];
			arr[high+1]=tmp;
		}
    }
};

3).希尔排序:

  直接插入排序折半排序都没有实际上减少移动次数,折半排序优化的是比较次数。

  希尔排序的思想在于:

    如果一个序列是正序的,则对它进行排序只用比较n-1次,而不用移动。因此,如果对于某个待排点i来说,如果i左侧的数组能够基本有序(不是完全有序),则它移动的次数将减少。

  希尔排序每一趟排序中,根据增量将序列分为若干组,每一组进行一个直接插入排序,这样每一组都是有序的,再将他们组合起来,也就是说,每一组都将这组的数据小的往前置顶,大的往后置后,则合并起来时相对整个数组来说,它的小数据集中到了前段,大数据集中到了后端,尽管不同的子组间的大小没有确定,但对于数组整体来说,它比这一趟希尔排序前变得更有序了。

  等到下一趟排序时,减小增量。减小增量代表在上一趟希尔排序的相对有序的基础上重整上一趟排序时子组间的相对大小。

  这样,每进行一趟希尔排序,数组的有序情况得到一定改善,直到最后增量为1时,相对来说比最初的数组的有序性更强了,在进行一次完整的直接插入排序,这样减少了插入过程中的移动次数。

class Solution {
public:
	void ShellSort(vector<int>& arr)
	{
		vector<int> dk;
		dk.push_back(5);
		dk.push_back(3);
		dk.push_back(1);
		for(int i=0;i<dk.size();i++)
			SortCore(arr,dk[i]);
	}
	void SortCore(vector<int>&arr,int dk)
	{
		for(int i=dk;i<arr.size();i++)
		{
			if(arr[i]<arr[i-dk])
			{
				int tmp=arr[i];
				int j=i-dk;
				for(;j>=0&&arr[j]>tmp;j=j-dk)
					arr[j+dk]=arr[j];
				arr[j+dk]=tmp;
			}
		}
	}
};

  

原文地址:https://www.cnblogs.com/lxy-xf/p/11326302.html

时间: 2024-08-30 04:57:55

几种排序方法的实现(更新中)的相关文章

七种排序算法(更新中。。。)

1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 using namespace std; 5 const int len = 20; 6 //1.冒泡排序 7 void Bubble_sort(int s[],int len){ 8 bool flag; 9 for(int i=1;i<len-1;++i){ 10 flag=false; 11 for(int j=1;j<=len-i

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

[系列汇总] - 二十三种设计模式(持续更新中&hellip;)

摘要 最近在读GOF的Design Patterns: Elements of Reusable Object-Oriented Software(设计模式:可复用面向对象软件的基础),学习前辈们的经验来增加自己的编码设计能力.在学习的过程中,会把我从书上学到的知识以及自己的理解写到这里.一方面能够巩固自己学到的东西同时方便以后的复习,另一方面是希望能够帮助到那些跟我一样不大了解设计模式的人. 我理解的设计模式不是一套固定的代码,更多的是一种设计理念.它能够帮助我们解决特定的设计问题,使我们的程

排序算法(更新中)

#include<stdio.h> #include<stdlib.h> #define SUM 50 void bubble_sort(int arr[],int count); void quick_sort(int arr[],int low,int high); void select_sort(int a[],int count); void swap_sort(int a[],int count); void insert_sort(int a[],int count)

数组的几种排序算法的实现

转自: http://blog.csdn.net/letthinking/article/details/6764996 . 数组的排序方法有很多,效率也各不相同,下面简单介绍一下几种常见的排序算法. 1.选择排序法:将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面.实现如下: [java] view plaincopy public int[] choiceSort(int[] arr){ for(int i = 0;i < a

css布局 - 垂直居中布局的一百种实现方式(更新中...)

首先将垂直居中的现象和实现方式两大方向细分类如下: 接下来逐条累加不同情况下的垂直居中实现. 目录: 一.父元素高度固定时,单行文本 | 图片的垂直居中 1. line-height行高简单粗暴实现法:line-height:Npx(N = 与元素高度相同的值) 2. vertical-middle上场: 二.父元素高度固定时,多行文本的垂直居中 1. 帮多行文本找一个继父来领养他,让继父弥补父元素给他带来的伤害(行高和水平居中对齐的样式修改) 2. margin负边距简单处理一下底部小“裂痕”

Python - 几种排序算法的实现

直接插入.选择排序.冒泡排序.快速排序.……归并排序.基数排序.希尔.堆排序. 直接插入: 思想是:1.将数据序列分成两部分,前一部分是有序的,后面一部分是无序的. 2.将无序变有序,首先从第一开始,然后第一,第二比较后排序,此时这两位就是有序的了:然后从无序的队列中取出第三位和第二位比较,然后他们中矮的再和第一位比较,此时三位是有序的: 然后再取出第四位,和前面的比较……,一直到最后一位比较. def insert_sort(aList): n = len(aList) for i in ra

[搜索]一种分词方法的实现

加上有一句话,thisisabook,要将之分成合适的单词,假设有一个字典,这个字典包含单词. 我刚看到这个需求,第一反应是用搜索中的分词方式,最大匹配法,后来经过高人指点,说不用,只需要遇到正确的单词就分出来,然后又想到了回溯法,再次经高人指点,回溯也不需要,只需要递归即可.下面是简单的实现代码,供参考: char *dict[]={"a","is","book","boo","this"}; bool

10种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要.为了选择合适的算法,可以按照建议的顺序考虑以下标准: (1)执行时间 (2)存储空间 (3)编程工作    对于数据量较小的情形,(1)(2)差别不大,主要考虑(3):而对于数据量大的,(1)为首要.   主要排序法有: 一.冒泡(Bubble)排序——相邻交换 二.选择排序——每次最小/大排在相应的位置 三.插入排序——将下一个插入已排好的序列中 四.壳(Shell)排序——缩小增量 五.归并排序 六.快速排序 七.堆排序 八.拓扑排序 九