冒泡排序和插入排序(直接插入、折半插入、希尔排序)(殷人昆版)

一、普通实现冒泡排序

冒牌排序的基本思想是:设待排序元素序列中的元素个数为n,首先比较第n-2个元素和第n-1个元素,如果发生逆序,则交换两个元素。其余处理方式相同。

void BubbleSort(int V[], int n)
{
	for(int i = 0; i < n; ++i)
	{
		for(int j = 1; j < n-i; ++j)
		{
			if(V[j-1] > V[j])
			{
				int tmp = V[j-1];
				V[j-1] = V[j];
				V[j] = tmp;
			}
		}
	}
}


二、加入bool标志避免顺序已排好还进行排序,浪费时间

加入bool值exchange用以标志本趟循环是否交换数据,若为false则直接结束。

void NewBubbleSort(int V[], int n)
{
	bool exchange;
	for(int i = 0; i < n; ++i)
	{
		for(int j = 1; j < n-i; ++j)
		{
			exchange = false;
			if(V[j-1] > V[j])
			{
				int tmp = V[j-1];
				V[j-1] = V[j];
				V[j] = tmp;

				exchange = true;
			}
		}
		if(!exchange)
		{
			return;
		}
	}
}


三、直接插入排序

直接插入排序的基本思想:当插入第i(i>=1)个元素时,前面的V[0]、V[1],……,V[i-1]已经排好序。这时用V[i]的排序码与V[i-1],V[i-2],……的排序码顺序进行比较,找到插入排序即将V[i]插入,原来位置上的元素向后顺移。

void InsertSort(int V[], int left, int right)
{
	int i, j;
	for(i = left+1; i < right+1; ++i)
	{
		if(V[i] < V[i-1])
		{
			int tmp = V[i];
			j = i-1;
			do
			{
				V[j+1] = V[j];
				j--;
			}while(j >= left && tmp < V[j]);
			//向后移位
			V[j+1] = tmp;
		}
	}
}


四、折半插入排序(二分法插入排序)

折半插入排序(二分法插入排序)的基本思想:设有一个元素序列V[0]、V[1]、V[2]……V[n-1]。其中V[0]、V[1]、V[2]……V[i-1]都是已经排好序的元素。在插入V[i]时,利用折半搜索法寻找V[i]的插入位置。

void BinaryInsertSort(int V[], int left, int right)
{
	int tmp, i, low, high, middle, k;
	for(i = left+1; i < right+1; ++i)
	{
		tmp = V[i];
		low  = left;
		high = i-1;
		while(low <= high)
		{
			middle = (low+high)/2;
			if(tmp < V[middle])
			{
				high = middle-1;
			}
			else
			{
				low = middle+1;
			}
		}
		for(k = i-1; k >= low; --k)
			//向后移位,移开插入的位置
		{
			V[k+1] = V[k];
		}
		V[low] = tmp;//插入
	}
}


五、希尔排序

希尔排序的基本思想:设待排序元素序列有n个,首先取整数gap

void ShellSort(int V[], int left, int right)
{
	int i, j, gap = right-left+1, tmp;
	do
	{
		gap = gap/3+1;//求下一增量
		for(i = left+gap; i < right+1; ++i)
		{
			if(V[i] < V[i-gap])
			{
				tmp = V[i];
				j = i-gap;
				do
				{
					V[j+gap] = V[j];//后移元素
					j = j-gap; //再比较前一元素
				}while(j >= left && tmp < V[j]);
				V[j+gap] = tmp;
			}
		}
	}while(gap > 1);
}



你可能感兴趣的:(数据结构,排序,数据结构,排序)