冒泡排序 选择排序 插入排序 快速排序
- 冒泡排序:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
- 维基百科冒泡排序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