排序方法之冒泡(雞尾酒)、選擇、插入(二分插入)、希爾排序


#include <stdio.h>

void swap(int *a, int i, int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}

void print(int *a,int len)
{
	int i;
	for(i = 0;i < len;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
}

int main()//冒泡排序
{
	int a[] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	
	int i,j;
	for(i = 0;i <len-1;i++)
	{
		for(j = 0;j < len-i-1;j++)
		{
			if(a[j] > a[j+1])
			{
				swap(a,j,j+1);
			}
		}
	}
	
	print(a,len);
	
	return 0;
}

int main()//冒泡排序之雞尾酒排序法
{
	int a[] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	
	int left = 0;
	int right = len - 1;
	int i;
	
	while(left < right)//判斷條件
	{
		for(i = left;i < right;i++)//從左到右最大數放在right位置
		{
			if(a[i] > a[i+1])
			{
				swap(a,i,i+1);
			}
		}
		right--;
		
		for(i = right;i > left;i--)//從右向左最小數放在left位置
		{
			if(a[i] < a[i-1])
			{
				swap(a,i,i-1);
			}
		}
		left++;
	}
	
	print(a,len);
	
	return 0;
}

int main()//選擇排序
{
	int a[] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	
	int i,j;
	int min;
	for(i = 0;i < len;i++)
	{
		min = i;
		for(j =i+1;j < len ;j++ )
		{
			if(a[min] > a[j])
			{
				min = j;
			}
		}	
		if(min != i)
			{
				swap(a,i,min);
			}
	}
	
	print(a,len) ;
	
	return 0;
}

int main()//插入排序
{
	int a[] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	int get;//保存待插入元素
	int i;
	int j;
	
	for(i = 1;i < len;i++)
	{
		get = a[i];
		j = i - 1;
		
		//找到第一個比待插入元素小的元素,並進行移位
		while(j >= 0 && a[j] > get)
		{
			a[j+1] = a[j];
			j--;
		}
		a[j+1] = get;
	}

	print(a,len);
	
	return 0;
}

int main()//插入排序之二分插入排序法
{
	int a[10] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	
	int i,j;
	int get;
	int left,right;
	for(i = 1;i < len;i++)
	{
		get = a[i];
		left = 0; //左邊界
		right = i - 1;//右邊界   初始時,只有一個數,left和right指向同一個數
		
		while(left <= right) // 找插入位置:查找完後要插入的位置在下標爲left的位置
		{
			int mid = (left + right) / 2;
			
			if( a[mid] > get) //判斷插入位置
			{
				right = mid - 1;  //插入左邊,設定右邊界
			}
			else
			{
				left  = mid + 1;   //插入右邊,設定左邊界
			}
		}
	
		for(j = i - 1;j >= left;j--)//進行移位,將left開始右邊的所有元素都右移一位
		{
			a[j+1] = a[j];
		}
		
		a[left] = get;
	}

	print(a,len);
	
	return 0;
}


int main() //希爾排序
{
	int a[] = {2,1,4,6,9,7,8,0,3,5};
	int len = sizeof(a) / sizeof(a[0]);
	
	int i,j;
	int get;
	int d = len;  //d代表每一次的步長
	do
	{
		d = d/3 +1;
		for(i = d;i < len;i++)
		{
			get = a[i];
			j = i - 1;
			
			while(j >= 0 && a[j] > get)
			{
				a[j+1] = a[j];
				j--;
			}
			a[j+1] = get;
		}
	}while(d > 1);
	
	print(a,len);
	return 0;
}



















發佈了58 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章