排序——c

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30648823/article/details/79764678
// 排序.cpp: 定义控制台应用程序的入口点。
// 陈鹏20171125

#include "stdafx.h"
#include "stdio.h"

//----------插入排序开始---------------
void ChaRuPaiXu(int *Data,int length) {						//传入数组和长度
	int temp;												//定义中间变量
	for (int i = 0; i < length  ; i++) {					//n个数字只需排列n-1次就可以完成排序
		temp = Data[i];										//从第一个数字开始往中间变量里面放
		for (int j = i; j > 0 && temp < Data[j-1]; j--) {	//先判断是不是第一个数字 如果是直接跳出  如果不是那就判断比前面的一个是不是小 并且递归
			Data[j] = Data[j-1];							//符合条件 将当前数据的前一位  替换  给当前位
			Data[j-1] = temp;								//将当前的数据  替换  前一位的数据的值
		}
	}
}
//-----------插入排序结束-------------

//-----------冒泡排序开始-------------
void MaoPaoPaiXu(int *Data,int length) {
	int temp;
	for (int i = 0; i < length; i++) {						//n个数字只需排列n-1次就可以完成排序
		for (int j = 0; j < length - i-1; j++) {			//往后每次少一个
			if (Data[j] > Data[j + 1]) {					//判断是不是大一些 大一些就往后移动
				temp = Data[j];
				Data[j] = Data[j + 1];
				Data[j + 1] = temp;
			}
		}
	}
}
//-----------冒泡排序结束-------------

//-----------希尔排序开始-------------
void XieErPaiXu(int *Data,int length) {
	int temp;
	for (int t = length / 2; t > 0; t /= 2)				//步长  
		for (int i = 0; i < t; i++){					//每次步长里面的移动
			for (int j = i + t; j < length; j += t)		//移动步长的位置
				if (Data[j] < Data[j - t]) { 
					int temp = Data[j];
					int k = j - t;
					while (k >= 0 && Data[k] > temp) {  //最后一次
						Data[k + t] = Data[k];
						k -= t;
					}
					Data[k + t] = temp;
				}
		}
}
//-----------希尔排序结束-------------

//-----------选择排序开始-------------
void XuanZhePaiXu(int *Data,int length) {
	int t,temp;
	for (int j = 0; j < length; j++) {
		temp = 0;
		t = 0;
		for (int i = 0; i < length-j; i++) {							//循环找出最大值
			if (temp < Data[i]) {
				temp = Data[i];											//最大的值放入temp
				t = i;													//最大的位置放入t
			}
		}
		Data[t] = Data[length - 1 - j] ;								//交换值
		Data[length - 1 - j] = temp;
	}

}
//-----------选择排序结束-------------


//-----------木桶排序开始------------- 次排序适合用于单个数据大小不长的排序  速度特快 比其以上的排序至少快一个次方级
void MuTongPaiXu(int *Data,int length) {
	int arr[100] = {0};//排序中最大的数字是多少就设置多少				
	for (int i = 0; i < length; i++) {									//将值当做位数在arr数组中自增
		arr[Data[i]]++;
	}
	int t = 0;															//t用来记录位数
	for (int i = 0; i < 100; i++) {
		while (arr[i]) {
			Data[t] = i;												//将arr中不为零位数的位数给Data以实现排序
			t++;
			arr[i]--;													//当数据里面有两个相同的数字
		}
	}
}

//-----------木桶排序结束-------------



/***************************************************************
****************************************************************
	main开始
****************************************************************
****************************************************************/
int main()
{
//----------插入排序开始---------------
	int cData[10] = { 1,2,3,7,8,9,4,5,6,0 };					//写入数据
	printf("插入排序前的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d",cData[i]);
	}
	ChaRuPaiXu(cData, 10);										//调用插入排序方法
	printf("\n插入排序后的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", cData[i]);
	}
	printf("\n-----------------------------------\n");
//-----------插入排序结束-------------

//-----------冒泡排序开始-------------
	int mData[10] = { 5,2,3,7,8,9,4,1,6,0 };
	printf("冒泡排序前的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", mData[i]);
	}
	MaoPaoPaiXu(mData, 10);										//调用插入排序方法
	printf("\n冒泡排序后的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", mData[i]);
	}
	printf("\n-----------------------------------\n");
//-----------冒泡排序结束-------------

//-----------希尔排序开始-------------
	int xData[10] = { 5,2,3,7,8,9,4,1,6,0 };
	printf("希尔排序前的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", xData[i]);
	}
	XieErPaiXu(xData, 10);										//调用插入排序方法
	printf("\n希尔排序后的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", xData[i]);
	}
	printf("\n-----------------------------------\n");
//-----------希尔排序结束-------------

//-----------选择排序开始-------------
	int zData[10] = { 5,2,3,7,8,9,4,1,6,0 };
	printf("选择排序前的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", zData[i]);
	}
	XuanZhePaiXu(zData, 10);										//调用插入排序方法
	printf("\n选择排序后的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", zData[i]);
	}
	printf("\n-----------------------------------\n");
//-----------选择排序结束-------------

//-----------木桶排序开始-------------
	int tData[10] = { 5,26,43,74,8,99,47,14,63,0 };
	printf("木桶排序前的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", tData[i]);
	}
	MuTongPaiXu(tData, 10);										//调用插入排序方法
	printf("\n木桶排序后的数为\n");
	for (int i = 0; i < 10; i++) {
		printf("%5d", tData[i]);
	}
	printf("\n-----------------------------------\n");
//-----------木桶排序结束-------------
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_30648823/article/details/79764678