C语言四种简单排序

冒泡排序 选择排序 插入排序 快速排序

  • 冒泡排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
  • 维基百科冒泡排序1
  • 百度百科冒泡排序2
  • 选择排序:是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕。
  • 维基百科 选择排序1
  • 百度百科选择排序2
  • 插入排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
  • 维基百科 插入排序1
  • 百度百科插入排序2
  • 快速排序:又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序{\displaystyle n}n个项目要{\displaystyle \ O(n\log n)}{\displaystyle \ O(n\log n)}(大O符号)次比较。在最坏状况下则需要{\displaystyle O(n^{2})}{\displaystyle O(n^{2})}次比较,但这种状况并不常见。事实上,快速排序{\displaystyle \Theta (n\log n)}{\displaystyle \Theta (n\log n)}通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
  • 维基百科快速排序1
  • 百度百科快速排序2
#include<stdio.h>
void maopao(int arr[],int n);
void xuanze(int arr[],int n);
void charu(int arr[],int n);

int main()
{
   int i,j;
   int arr1[10]={1,3,5,7,9,2,4,6,8,10};
   int arr2[10]={1,3,5,7,9,2,4,6,8,10};
   int arr3[10]={1,3,5,7,9,2,4,6,8,10};
   /*也可以自己输入
   int n;
   scanf("%d",&n);
   for( i = 0;i<n;i++)
   {
   	scanf("%d",arr[i]);
   }
  */
   maopao(arr1,10);
   xuanze(arr2,10);
   charu(arr3,10);
   return 0;
} 
void maopao(int arr[],int n)
{
   int i,j,temp;
   for(i=0;i<n;i++)//比较第n趟
   	//还有一种方法
   //for(i=n-1;i>0;i--) 
   {
   	for(j=0;j<n-i-1;j++)//比较n-i-1次
   	//for(j=0;j<i;j++)
   	{
   		if(arr[j]<arr[j+1])//两两比较,大的数放前面
   		{
   		  temp=arr[j];
   		  arr[j]=arr[j+1];
   		  arr[j+1]=temp;
   		}
   	 } 
   }
   	for(i=0;i<n;i++)
   {
   	printf("%d ",arr[i]);
   }
   printf("\n");
} 
void xuanze(int arr[],int n)
{
   int i,j,x; 
   for(i=0;i<n-1;i++)//假设第一个为最大
   {
      	for(j=i+1;j<n;j++)//让第一个依次与后面的比较,交换 ,再让被交换到第一个的数和后面的比较 ,重复重复
      	{
      		if(arr[i]<arr[j])
      		{
      			x=arr[i];
      			arr[i]=arr[j];
      			arr[j]=x;
      		}
         }
   }
   /*另外的一种选择排序,书上写的好像是这个
void SelectSort(int a[],int n)  
{  
   int i,j;  
   for(i=0;i<n-1;i++)            
   {  
       int k=i;                    
       for(j=i+1;j<n;j++)            
           if(a[k]>a[j])  k=j;    
              if(k!=i)  
          {  
               int temp=a[i];  
               a[i]=a[k];  
               a[k]=temp;  
          }  
   }  
 
}  
*/

   for(int i=0;i<n;i++)
   {
   	printf("%d ",arr[i]);
   }
   printf("\n");
}
void charu(int arr[],int n)
{
   for(int i=1;i<n;i++)//假设第一个最大
   {
   	if(arr[i]<arr[i-1])//若前一个小于后一个
   	{
   		int temp = arr[i];//把要插入的数拿出来
   		int j;
   		for(j = i-1;j>-1&&temp<arr[j];j--)//往后移动,空出要插入数字的位置
   		{
   			arr[j+1]=arr[j];
   		}
   		arr[j+1] = temp;//让被拿出来的数插入到空出来的位置
   	}	
   }	
   	for(int i=0;i<n;i++)
   {
   	printf("%d ",arr[i]);
   }
   printf("\n");
}
/*
冒泡排序
3 5 7 9 2 4 6 8 10 1
5 7 9 3 4 6 8 10 2 1
7 9 5 4 6 8 10 3 2 1
9 7 5 6 8 10 4 3 2 1
9 7 6 8 10 5 4 3 2 1
9 7 8 10 6 5 4 3 2 1
9 8 10 7 6 5 4 3 2 1
9 10 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
选择排序
10 1 3 5 7 2 4 6 8 9
10 9 1 3 5 2 4 6 7 8
10 9 8 1 3 2 4 5 6 7
10 9 8 7 1 2 3 4 5 6
10 9 8 7 6 1 2 3 4 5
10 9 8 7 6 5 1 2 3 4
10 9 8 7 6 5 4 1 2 3
10 9 8 7 6 5 4 3 1 2
10 9 8 7 6 5 4 3 2 1
插入排序
3 1 5 7 9 2 4 6 8 10
5 3 1 7 9 2 4 6 8 10
7 5 3 1 9 2 4 6 8 10
9 7 5 3 1 2 4 6 8 10
9 7 5 3 2 1 4 6 8 10
9 7 5 4 3 2 1 6 8 10
9 7 6 5 4 3 2 1 8 10
9 8 7 6 5 4 3 2 1 10
10 9 8 7 6 5 4 3 2 1
*/
  • 快速排序
#include <stdio.h>
void dayin(int arr[],int len)
{
   for(int i = 0;i<len;i++)
   {
   	printf("%d ",arr[i]);
   }
   printf("\n");
}
void swap(int* a,int* b)
{
   int temp = *a;
   *a = *b;
   *b = temp;
}
void quicksort(int arr[],int len,int low,int high)
{
   if(low<high)
   {
   	int i = low+1;
   	int j = high;
   	while(i<j)
   	{
   		if(arr[low]<arr[i])
   		{
   			swap(&arr[i],&arr[j]);
   			j--;
   		}
   		else
   		{
   			i++;
   		}	 
   	}
   	if(arr[low]<=arr[i])
   	{
   		i--;
   	}
   	swap(&arr[low],&arr[i]);
   	dayin(arr,len);
   	quicksort(arr,len,low,i);
   	quicksort(arr,len,j,high);
   }
} 
int main()
{
	int arr[] = {1,3,5,7,9,2,4,6,8,10};
	int len = sizeof(arr)/sizeof(arr[0]);
	printf("排序之前:");
	dayin(arr,len);
	quicksort(arr,len,0,len-1);
	printf("排序之后:");
	dayin(arr,len);
	return 0;
}
/*
排序之前:1 3 5 7 9 2 4 6 8 10
1 5 7 9 2 4 6 8 10 3
1 2 3 4 5 6 8 10 9 7
1 2 4 5 3 6 8 10 9 7
1 2 3 4 5 6 8 10 9 7
1 2 3 4 5 6 8 10 9 7
1 2 3 4 5 6 8 10 9 7
1 2 3 4 5 8 10 9 7 6
1 2 3 4 5 7 6 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 10 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
排序之后:1 2 3 4 5 6 7 8 9 10
*/

2019/12/27 9/33

发布了21 篇原创文章 · 获赞 5 · 访问量 748

猜你喜欢

转载自blog.csdn.net/weixin_45862170/article/details/103656268
今日推荐