c/c++常见算法

冒泡排序

遍历数据,比较相邻数据 大小 ,依次交换相邻数据

手上17上扑克牌 从最左边(或最右边)相邻扑克牌比较大小后交换位置(第一张和第二张比,最大的放最右边。第二张和第三张比,最大的放最右边。依此次序比完17张牌。那么第17张为最大,将剩下的16张依上方法,在比一次。依次比剩下的15张,14,13等等等)(优化是  当比较一轮剩余的牌的时候(17,16,15等等等)若没有大小置换,即表示早已排好序,无需排剩下的牌)

#include<iostream>
using namespace std;
void bubblesort(int str[],int len)
{
	for(int i=0;i<len-1;i++)
           {
		int count=0;//count用来控制:当遍历完成之前已排好序时,不再继续遍历
		for(int j=len-1;j>i;j--)
                   {
			if(str[j-1]>str[j])
                          {
				int temp=str[j-1];
				str[j-1]=str[j];
				str[j]=temp;
				count=1;
			   }
		    }
		if(count==0) break;

		cout<<"第"<<i+1<<"次遍历结果:";
		for(int a=0;a<len;a++)
		cout<<str[a]<<" ";
		cout<<endl;
	 }
 
}
int main()
{
	int  str[5]={5,2,6,3,7};
	int len=sizeof(str)/sizeof(str[0]);
	bubblesort(str,len);
	cout<<"最终排序结果:";
	for(int i=0;i<len;i++)
		cout<<str[i]<<" ";
	cout<<endl;
	return 0;
}

选择排序

遍历数据 ,将数据中最小值放入数据前 。接着找出剩下数据最小值 依旧放入剩下数据最前

17张牌,找出最小的放入最前,接着找出剩余的牌中最小的值放入剩余牌的最前面。依次循环

#include <iostream>
using namespace std;
void select_sort(int array[],int length)
{
	cout << length <<endl;
	int k ;
	for (int i = 0 ; i < length  ;i ++)
            {
		int min = i,k;
		for(int j = i +1 ; j < length  ; j++)	
                   {
			if (array[j] < array[min])
                           {
				min = j;
			   }
		   }
		if (min != i)
                   {
			k = array[i];
			array[i] = array[min];
			array[min] = k; 
		   }
	    }
}
int main ()
 {
	int array[] = {99,1,3,4,8,12,24,66,43,31};
	select_sort(array,sizeof(array)/sizeof(int));
	for (int i = 0 ;i < sizeof(array)/sizeof(int);i++)
            {
		cout << array[i] << endl;
	    }
	return 0;
}

插入排序

和抓牌一样 ,抓起一张,按照大小,将牌插入已经抓好的牌中

#include "stdafx.h"
 
int A[10] = {3,2,6,4,1,5,7,9,8,10};
 
void Insert_Sort(int *A, int length)
{
	for(int j = 1; j < length; j++)
	{
		int key = A[j];
		int i = j - 1;
		while(i >= 0 && A[i] > key)
		{
			A[i+1] = A[i];
			i = i - 1;
		}
		A[i+1] = key;
	}
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	Insert_Sort(A,10);
	for(int i = 0; i < 10; i++)
	{
		printf("%d ", A[i]);
	}
	return 0;
}

希尔排序

按照牌数多少,进行排序  ,手上10张牌   抽出间隔为5的两张牌来比较 进行排序交换。 在抽出间隔为2的五张牌来比较,进行排序 交换 。在抽出间隔为1的10张牌进行排序。

#include <iostream>
#include <stdlib.h>
using namespace std;
 

 
void ShellSort(int array[], int Length)  //希尔排序函数
{
  int i, j, step;
  //step步长是根据10个元素这种情况定义的
  for (step = Length/ 2; step > 0; step = step / 2)  
      {
	for (i = 0; i < step; i++)  //i是子数组的编号
            {
              //数组下标j,数组步长下标j+step
	      for (j = i + step; j < Length; j = j + step) 
	          {
		    if (array[j] < array[j - step])
		       {
			int temp = array[j];  //把数组下标j的值放到temp中
			int k = j - step;
 
			while (k >= 0 && temp < array[k])
			      {
				array[k + step] = array[k];  //把大的值往后插入
				k = k - step;
			       }
			array[k + step] = temp;  //把小的值往前插入
			}
		    }
	     }
	}
}
 
 
int main(void)  //主程序
{
	const int n = 10;  //数组元素的数量
	int array[n];
	cout << "请输入10个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}
 
	cout << endl;  //换行
 
	ShellSort(array, n);  // 调用BubbleSort函数  进行比较
 
	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}
 
	cout << endl << endl;  //换行
 
	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值