排序--两路排序

#include<iostream>
using namespace std;
#define SIZE 21
typedef int Sqlist[SIZE];

void TwayTnsertSort(Sqlist &T,Sqlist &S,int n)
{
	 int i,j,k;
     int first=0;
	 int last = 0;
	 S[first]= S[last] = T[0];
	 for(i=1;i<n;++i)
	 {
	    if(T[i] >= S[last])
		{
		    S[++last] = T[i];
		}
		else if(T[i] < S[first])
		{
			S[(first-1+n)%n] = T[i];
			first=(first-1+n)%n;
		}
       else
	   {
		    S[++last] = S[last-1];
		    for(j=last-1;T[i]<S[(j-1+n)%n];j=(j-1+n)%n)
			{
			    S[j] = S[(j-1+n)%n];
			}
			S[j] = T[i];
	   }
	 }
	 for(k=0;k<n;++k)
	 {
	    T[k] = S[(first+k)%n];
	 }
}
void main()
{
	Sqlist T= {49,38,65,97,76,13,27};
	Sqlist S;
	TwayTnsertSort(T,S,7);
	for(int i=0;i<7;++i)
	  cout<<T[i]<<" ";
	cout<<endl;
}

分析:两路插入减少了哨兵位的使用,只能减少记录的移动次数。

时间: 2024-11-10 16:37:41

排序--两路排序的相关文章

排序两个排序的链表----递归非递归实现

ListNode* Merge1(ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL) return pHead2; else if(pHead2 == NULL) return pHead1; ListNode* pMergedHead = NULL; if(pHead1->m_nValue < pHead2->m_nValue) { pMergedHead = pHead1; pMergedHead->m_pNext

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

mysql 排序长度限制之max_length_for_sort_data以及mysql两种排序算法

SET max_length_for_sort_data = 1024 SHOW VARIABLES LIKE '%max_length_for_sort_data%'; 查询:SELECT * FROM CS_COLUMNS ORDER BY table_name,column_name LIMIT 0,100 错误代码: 1815Internal error: IDB-2015: Sorting length exceeded. Session variable max_length_for

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目解析:本题关键之处在于时间复杂度要求为O(log(m+n)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st

合并两个排序的链表(剑指offer)

合并两个排序的链表 参与人数:1527时间限制:1秒空间限制:32768K 通过比例:27.96% 最佳记录:0 ms|8552K(来自  牛客708854号) 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目链接:http://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?rp=1&ru=/ta/coding-interviews&qru=/ta/codin

面试题17:合并两个排序的链表

ListNode类(结点类) 1 package leetcode.utilities; 2 3 public class ListNode { 4 public int val ; 5 public ListNode next ; 6 public ListNode(int val) { 7 // TODO Auto-generated constructor stub 8 this.val = val; 9 this.next = null ; 10 } 11 //打印链表 12 publi

HashMap的两种排序方式

Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.