常见排序算法

7 篇文章 0 订阅
2 篇文章 0 订阅

一、冒泡排序

算法思想:首先将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,以此类推,直至第n-1个和第n个记录的关键字比较过为止;至此第一趟冒泡排序完成,对前n-1个记录的关键字按照第一趟的冒泡排序排序,依次循环,直到最后缩到第一个为止

#include<stdio.h>
void bubble_sort(int a[],int n)
{
	int i, j, t;
  for(j = 0; j < n ; j++)
 	{
	  for(i = 0; i < n - j - 1; i++)	//注意是n-j-1,因为一趟遍历n个数,要两两比较n-1次
	  {
	     if(a[i] > a[i+1])	//把值比较大的元素沉到底
	     {
	        t = a[i];
	        a[i] = a[i+1];
	        a[i+1] = t;
	     }
	  }
 	}
}

int main()
{
	int i, j;
	int arr[] = {2,4,8,5,9,7,1,10,3,6};
	for(i = 0; i < sizeof(arr)/sizeof(int); i++)
		printf("%d ",arr[i]);
	bubble_sort(arr, sizeof(arr)/sizeof(int));
	printf("\n");
	for(j = 0; j < sizeof(arr)/sizeof(int); j++)
		printf("%d ",arr[j]);
}


二、选择排序

算法思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

#include<stdio.h>
void select_sort(int arr[], int n)
{
	int i, j, k, t;
	for(i=0; i<n-1; i++)
	{
		k = i;
		for(j=i+1; j<n; j++)
		{
			if(arr[j] < arr[k])
				k = j;
		}
		if(k != i)
		{
			t = arr[i];
			arr[i] = arr[k];
			arr[k] = t;
		}
	}

}

int main()
{
	int i, j;
	int arr[] = {2,4,8,5,9,7,1,10,3,6};
	for(i = 0; i < sizeof(arr)/sizeof(int); i++)
		printf("%d ",arr[i]);
	select_sort(arr, sizeof(arr)/sizeof(int));
	printf("\n");
	for(j = 0; j < sizeof(arr)/sizeof(int); j++)
		printf("%d ",arr[j]);
}

 

 

三、直接插入排序

算法思想:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

#include<stdio.h>
void insert_sort(int arr[], int n)
{
	int i, j, t;
	for (i = 1; i < n; i++)
	{
		t = arr[i];
		for(j=i-1; j>=0 && arr[j]>t; j--)
			arr[j+1] = arr[j];
		arr[j+1] = t;
	}
}

int main()
{
	int i, j;
	int arr[] = {2,4,8,5,9,7,1,10,3,6};
	for(i = 0; i < sizeof(arr)/sizeof(int); i++)
		printf("%d ",arr[i]);
	insert_sort(arr, sizeof(arr)/sizeof(int));
	printf("\n");
	for(j = 0; j < sizeof(arr)/sizeof(int); j++)
		printf("%d ",arr[j]);
}



四、希尔排序

算法思想:希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

#include<stdio.h>
void shell_sort(int arr[], int n)
{
	int d, i, j, t;
	for(d=n/2; d>=1; d=d/2)
	{
		for(i=d; i<n; i++)
		{
			t = arr[i];
			for(j=i-d; j>=0 && arr[j]>t; j=j-d)
				arr[j+d] = arr[j];
			arr[j+d] = t;
		} 
	}
}

int main()
{
	int i, j;
	int arr[] = {2,4,8,5,9,7,1,10,3,6};
	for(i = 0; i < sizeof(arr)/sizeof(int); i++)
		printf("%d ",arr[i]);
	shell_sort(arr, sizeof(arr)/sizeof(int));
	printf("\n");
	for(j = 0; j < sizeof(arr)/sizeof(int); j++)
		printf("%d ",arr[j]);
}


五、快速排序

算法思想:快速排序(Quicksort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

#include<stdio.h>
void quick_sort(int data[], int low, int high) 
{
	int mid; 
	if(low < high) 
	{
		mid = partition(data, low, high); 
		quick_sort(data, low, mid-1); /* 递归调用 */
		quick_sort(data, mid+1, high);
	} 
}

int partition(int data[], int low, int high) 
{
	int tmp;
	while(low < high) 
	{
		while((low < high) && (data[high] >= data[low]))	//high-->low
			--high;
		if(low < high)
		{
			tmp = data[low];
			data[low] = data[high];
			data[high] = tmp;
			low++;
		}
	
		while((low < high) && (data[low] <= data[high]))	//low-->high
			++low;
		if(low < high)
		{
			tmp = data[low];
			data[low] = data[high];
			data[high] = tmp;
			high--;
		}  
	}  
	return low;     		
} 


int main()
{
	int i, j;
	int arr[] = {2,4,8,5,9,7,1,10,3,6};
	for(i = 0; i < sizeof(arr)/sizeof(int); i++)
		printf("%d ",arr[i]);
	quick_sort(arr, 0, sizeof(arr)/sizeof(int)-1);
	printf("\n");
	for(j = 0; j < sizeof(arr)/sizeof(int); j++)
		printf("%d ",arr[j]);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值