void shift(int a[] , int i , int m)
{
int k , t
t = a[i]k = 2 * i + 1
while (k <m)
{
if ((k <m - 1) &&(a[k] <a[k+1])) k ++
if (t <a[k]) {a[i] = a[k]i = kk = 2 * i + 1}
else break
}
a[i] = t
}
void heap(int a[] , int n) //a 为排序数组,n为数组大小(编号0-n-1)
{
int i , k
for (i = n/2-1i >= 0i --) shift(a , i , n)
for (i = n-1i >= 1i --)
{
k = a[0]a[0] = a[i]a[i] = k
shift(a , 0 , i)
}
}
void main()
{
int a[10],i
for(i=0i<10i++)
scanf("%d",&a[i])
heap(a,10)
for(i=0i<10i++)
printf("%d",a[i])
}
1、冒泡排序(最常用)冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
#include <stdio.h>#include <stdlib.h>
#include <string.h>
int sort_function( const void *a, const void *b)
char list[5][4] = { "cat", "car", "cab", "cap", "can" }
int main(void)
{
int x
qsort((void *)list, 5, sizeof(list[0]), sort_function) // 调用快速排序
for (x = 0x <5x++)
printf("%s\n", list[x])
return 0
}
int sort_function( const void *a, const void *b)
{ //自已要定义一个简单的比较函数就可
return( strcmp((char *)a,(char *)b) )
}
// C++中自身有一个通用的快速 qsort,可以用它 ,自已要定义一个简单的比较函数就可