排序的三种方式(冒泡,插入,和选择)

原创 2016年06月02日 02:20:34
一:冒泡排序:
#include<stdio.h>
#include<string.h>

void bubble_sort(int *arr,int len)
{
	
	int i=0;
    int j=0;
	int tmp=0;
	int flag=0;//设置标志位,从而来判断每次进入内层循环时是否有数据的交换,减少程序的运行
	int mark=len-1;//控制内部循环的次数
	int n=0;//保存内部循环数字交换的最后一位的下表
	for(i=0;i<len-1;i++)
	{
		flag=1;
		for(j=0;j<mark;j++)
		{
			if(arr[j]>arr[j+1])
			{
				tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
				flag=0;//如果内部发生交换,则flag设置为0
                n=j;//保存最后一次交换的位置的下标
			}
		}
		if(flag)//如果一趟走完flag为1,说明内部没有发生交换。证明后面的数字已经有序,直接跳出
		{
			break;
		}
		mark=n;//将下标赋给mark,减少下次内部循环的次数,提高效率
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
	bubble_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}


二:选择排序:
#include<stdio.h>
#include<string.h>
void Selection_sort(int *arr,int len)
{
	int i=0;
	int j=0;
	int min=0;//用于交换数字
	int k=0;//记录最小数字的下标
	if(len==1)//如果只有一个数字,不必排序,直接返回
	{
		return ;
	}
	for(i=0;i<len-1;i++)//从第一个数字开直到倒数第二个数字结束比较
	{
		k=i;//记录每次开始的下标
		for(j=i+1;j<len;j++)//从小一次下标开始,寻找最小值的下标
		{
			if(arr[j]<arr[k])
			{
				k=j;//用k记住
			}
		}
		if(k!=i)//如果k不是开始进入时的下标,则交换变量
		{
			min=arr[k];//把k下标之后的最小值和k下标的值做交换
			arr[k]=arr[i];
			arr[i]=min;
		}
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
    Selection_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}



三:直接插入排序:
#include<stdio.h>
#include<string.h>
void Direct_insertion_sort(int *arr,int len)
{
	int i=0;
	int j=0;
	int tmp=0;//记录每次排序完成后的最后一个数字的后一位,就是待排序的数字
	for(i=1;i<len;i++)//默认第一个数字已经排好序,从第二个数字开始
	{
		tmp=arr[i];//记录每次的待排序的数字
		j=i-1;//待排序数字的前一位数字的下标
         while((arr[j]>tmp)&&(j>=0))//用while循环,将待排序的数字和前面以排好的数字进行一一的比较
		 {
			 arr[j+1]=arr[j];//符合条件就向后移
			 j--;
		 }
		 arr[j+1]=tmp;//a[i]插入适当位置
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
    Direct_insertion_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言中冒泡法、选择法、插入法三种常见排序算法

一、冒泡法  算法要求:用起泡法对10个整数按升序排序。     算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次...

java中的三种排序算法详解(直接选择.冒泡.插入)

package lianxi;public class Sort {public static void main(String args[]){int[] a = {2,15,9,7,36,16,1...
  • nana129
  • nana129
  • 2014年08月10日 18:56
  • 869

数据结构 三种简单的排序(插入、选择、冒泡)

#include "stdio.h" #include "stdlib.h" #include "time.h" #define MAX 10 #define SWAP(x,y) {int t;t...

O(N2)的三种排序-- 冒泡、选择、插入(java代码)

1冒泡排序 1原理 2代码 3复杂度 2选择排序 1原理 2代码 3复杂度 3插入排序 1原理 2代码 3复杂度 4三个排序算法的小结与比较...

C语言中冒泡法、选择法、插入法三种常见排序算法分析

一、冒泡法(起泡法)  算法要求:用起泡法对10个整数按升序排序。     算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j...

三种基础排序(冒泡、选择、插入排序)

这是本人的第一篇博客,看了刘未鹏大神的《暗时间》,想想还是应该写点博客,虽然内容都是从比人那里学来的,但是用自己的话去再诠释一遍,可能会有意外的收获。 好了,废话就到这里了,下面开始用最简单的方式介绍...

冒泡、选择、插入三种排序

工作闲下来了,偶来学习下排序算法的思想,适当的缓解下压力,换个思考方式也很不错的。 冒泡排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走...

C语言中冒泡法、选择法、插入法三种常见排序算法分析

标 题: C语言中冒泡法、选择法、插入法三种常见排序算法分析 作 者: lcx4 时 间: 2016-4-17 链 接: http://www.lcx4.com/?post=53 ...

三种初级排序算法(冒泡、选择、直接插入)java实现及其性能比较

排序就是将一组对象按照某种逻辑顺序重新排列的过程。排序在很多地方可以用到,比如在淘宝购物时,完全可以根据自己的需要对搜索到的商品进行排序。在计算时代早期,大家普遍认为30%的计算周期都用在了排序上,但...

【算法基础】冒泡、选择、插入排序(三种基本排序)

冒泡、选择、插入排序
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序的三种方式(冒泡,插入,和选择)
举报原因:
原因补充:

(最多只允许输入30个字)