排序算法:选择排序;冒泡排序;插入排序;希尔排序;快速排序;合并排序;堆排序

在这里插入图片描述
代码实现:
选择排序

def swap(lyst,i,j):
	temp=lyst[i]
	lyst[i]=lyst[j]
	lyst[j]=temp

def selectionSort(lyst):
	i=0
	while i<len(lyst)-1:
		minIndex=i
		j=i+1
		while j<len(lyst):
			if lyst[j]<lyst[minIndex]:
				minIndex=j
			j+=1
		if minIndex != i:
			swap(lyst,minIndex,i)
		i+=1

冒泡排序:

 def bubbleSort(lyst):
    	n=len(lyst)
    	while n>1:
    		i=1
    		while i<n:
    			if lyst[i]<lyst[i-1]:
    				swap(lyst,i,i-1)
    			i+=1
    		n-=1

插入排序:

  def insertSort(lyst):
    	i=1
    	while i<len(lyst):
    		itemtoinsert=lyst[i]
    		j=i-1
    		while j>=0:
    			if itemtoinsert<lyst[j]:
    				lyst[j+1]=lyst[j]
    				j-=1
    			else:
    				break
    		lyst[j+1]=itemtoinsert
    		i+=1

希尔排序:是插入排序的一种,是不稳定排序方法。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
在这里插入图片描述
操作步骤:
初始时,有一个大小为 10 的无序序列。
(1)在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。接下来,按照直接插入排序的方法对每个组进行排序。9和4这一组需要互换;1和8这组不需要;…
(2)在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。按照直接插入排序的方法对每个组进行排序。4和2这一组需要互换;1和3这一组不需要;…
(3)在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
参考:https://blog.csdn.net/qq845579063/article/details/51447404
堆排序的基本思想是:将待排序序列构造成一个大顶堆(二叉搜索树),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。最坏时间复杂度O(nlog(n))

C语言产生随机数并排序:选择排序和冒泡排序的实现

#include <stdio.h>
#include<stdlib.h>
#include<time.h>

#define TRUE 1
#define FALSE 0
#define N 100
#define VALUE_MAX 3000
int *select_sort(int *a)
{
	/*选择排序*/
	int tmp;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < i; j++)
		{
			if (*(a + i) > *(a + j)) {
				tmp = *(a + i);
				*(a + i) = *(a + j);
				*(a + j) = tmp;
			}
		}
	return a;
}


int *sort(int *a)
{
	/*冒泡排序*/
	int tmp;
	for (int i = 0; i<N; i++)
		for (int j = 0; j<N-i-1; j++)
		{
			if (*(a + j)<*(a + j+1)) //<是从大到小。>从小到大
			{
				tmp = *(a + j);
				*(a + j) = *(a + j+1);
				*(a + j+1) = tmp;
			}
		}
	return a;
}

int main()
{
	system("cls");
	int *h;
	int a[N];
	int i;
	srand((unsigned)time(NULL));
	for (i = 0; i<N; i++)
	{
		a[i] = rand() % VALUE_MAX;
	}
	for (i = 0; i<N; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");
	printf("%s\n", "*********************");
	//h = select_sort(a);
	h = sort(a);
	for (i = 0; i<N; i++)
	{
		printf("%d ", *(h + i));
	}
	system("pause");
	return 0;
}

一个比较全的C语言的排序算法:https://www.cnblogs.com/maluning/p/7944809.html
下边的C语言实现的四个排序算法

#include <stdio.h>
#include<stdlib.h>
#include<time.h>

#define TdInt32 int
#define TdFloat float
#define N 10000
#define VALUE_MAX 30000
#define VALUE_MIN 3
#define print_num 20

TdInt32 creat_random(TdFloat **_value, TdInt32 num)
{
	TdFloat *a = NULL;//*a = NULL
	TdInt32 RET = 0;
	a = (TdFloat *)malloc(sizeof(TdFloat)*N);
	srand((unsigned)time(NULL));
	for (TdInt32 i = 0; i<N; i++)
	{
		//a[i] = rand() % VALUE_MAX;
		a[i] = VALUE_MIN + 1.0 * rand() / 32767 * (VALUE_MAX - VALUE_MIN);//rand的最大值是32767
	}
	*_value = a;
	return RET;
}



TdInt32 select_sort(TdFloat *a, TdInt32 num)
{
	/*选择排序*/
	TdFloat tmp;
	TdInt32 RET = 0;
	TdInt32 i, j;
	for (i = 0; i < num; i++)
		for (j = 0; j < i; j++)
		{
			if (*(a + i) > *(a + j)) {
				tmp = *(a + i);
				*(a + i) = *(a + j);
				*(a + j) = tmp;
			}
		}
	return RET;
}

TdInt32 sort(TdFloat *a, TdInt32 num)
{
	/*冒泡排序*/
	TdFloat tmp;
	TdInt32 RET = 0;
	TdInt32 i, j;
	for (i = 0; i<num; i++)
		for (j = 0; j<num -i-1; j++)
		{
			if (*(a + j)<*(a + j+1)) //<是从大到小。>从小到大
			{
				tmp = *(a + j);
				*(a + j) = *(a + j+1);
				*(a + j+1) = tmp;
			}
		}
	return RET;
}


//快速排序
void swap(TdFloat *x, TdFloat *y)
{
	TdFloat tmp = *x;
	*x = *y;
	*y = tmp;
}
TdInt32 patition(TdFloat *a, TdInt32 left, TdInt32 right)
{
	TdInt32 j = left;    //用来遍历数组
	TdInt32 i = j;    //小于基准元素的最后一个
	TdFloat key = a[right];    //基准元素,把小于等于基准元素的放到左边,大于基准元素的放到右边
	for (; j < right; ++j) 
	{
		if (a[j] <= key)
		{		
			swap(&a[j], &a[i]);
			i++;//比基准值小,i往后挪一个
		}			
	}	
	swap(&a[right], &a[i]);//把基准元素放到中间	
	return i;//返回数组中间位置
}
void quickSort(TdFloat *a, TdInt32 left, TdInt32 right) {
	if (left >= right)
		return;
	TdInt32 mid = patition(a, left, right);
	quickSort(a, left, mid - 1);
	quickSort(a, mid + 1, right);
}
//插入排序
TdInt32 InsertSort(TdFloat  *a, TdInt32 n) {
	TdFloat tmp;
	TdInt32 RET = 0;
	for (TdInt32 i = 1; i < n; i++) 
	{
		TdInt32 j = i - 1;
		if (a[i] < a[j]) //每次和它前一个比,如果比前一个小开始交换
		{
			tmp = a[i];//基准数
			a[i] = a[j];
			while (tmp < a[j - 1]) //直到tmp找到正确的位置
			{
				a[j] = a[j - 1];
				j--;
			}
			a[j] = tmp;
		}
	}
	return RET;
}

TdInt32 print_k(TdFloat  *a, TdInt32 k,  TdInt32 n)
{
	TdInt32 RET = 0;
	for (TdInt32 i = 0; i < k; i++)
	{
		printf("%f\n", a[i]);
	}
	printf("..............................\n");
	for (TdInt32 i = n-10; i < n; i++)
	{
		printf("%f\n", a[i]);
	}
	return RET;
}






TdInt32 main()
{
	while (1)
	{
		system("cls"); 
		TdInt32 i;
		TdInt32 ret = 0;
		//TdFloat *a=(TdFloat *)malloc(sizeof(TdFloat)*N);
		TdFloat *a=NULL;
		ret = creat_random(&a, N);	//用一个指针来传
		if (ret)
		{
			printf("生成随机数有误");
			break;
		}
		ret = print_k(a, print_num, N);
		if (ret)
		{
			printf("打印有误");
			break;
		}
		printf("\n");
		printf("%s\n", "*********************");
		printf("	____________________________________________________________\n");
		printf("	||---->                     请选择排序方式              <----|\n");
		printf("	||----> 1:                    冒泡排序                 <----|\n");
		printf("	||----> 2:                   选择排序                 <----|\n");
		printf("	||----> 3:                   快速排序                   <----|\n");
		printf("	||----> 4:                   插入排序                   <----|\n");
		printf("	___________________________________________________________|\n");
		TdInt32 choice;
		printf("请输入你的选择\n");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			system("cls");  //清屏
			ret = sort(a, N);
			if (ret)
			{
				printf("      排序有误!\n       ");
				system("pause");
				break;
			}
			break;
		case 2:
			system("cls");  //清屏
			ret = select_sort(a, N);
			if (ret)
			{
				printf("      排序有误!\n       ");
				system("pause");
				break;
			}
			break;
		case 3:
			system("cls");  //清屏
			quickSort(a, 0, N - 1);
			break;
		case 4:
			system("cls");  //清屏
			ret = InsertSort(a, N);
			if (ret)
			{
				printf("      排序有误!\n       ");
				system("pause");
				break;
			}
			break;
		default:
			system("cls");  //清屏
			printf("\n\n");
			printf("      输入有误!\n       ");
			printf("\n\n");
			system("pause");
		}
	ret = print_k(a, print_num, N);
	if (ret)
	{
		printf("打印有误");
		break;
	}
	system("pause");
	return ret;
	}
	
		
	
/*
	system("cls");
	TdInt32 ret=0;
	//TdFloat a[N];
	TdFloat *a =(TdFloat *)malloc(sizeof(TdFloat)*N);
	TdInt32 i;
	srand((unsigned)time(NULL));
	for (i = 0; i<N; i++)
	{
		//a[i] = rand() % VALUE_MAX;
		a[i] = VALUE_MIN + 1.0 * rand() / 32767 * (VALUE_MAX - VALUE_MIN);//rand的最大值是32767
	}
	for (i = 0; i<N; i++) {
		printf("%f\n", a[i]);
	}
	printf("\n");
	printf("%s\n", "*********************");
	//ret=sort(a,N);
	if (ret)
	{
		printf("排序有误");
	}

	//ret=select_sort(a,N);
	if (ret)
	{
		printf("排序有误");
	}

	//quickSort(a, 0, N - 1);
	ret=InsertSort(a, N);
	if (ret)
	{
		printf("排序有误");
		return 0;
	}


	for (i = 0; i<N; i++)
	{
		printf("%f\n", *(a + i));
		
	}
	system("pause");
	return ret;*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值