一、简单选择排序
简单选择排序即每次选出最小或最大的元素与当前长度数组的最末尾进行交换,进行n-1次交换即可得到有序序列。
1、平均时间复杂度为O(n^2)
2、最好与最坏时间复杂度都为O(n^2)
3、空间复杂度为O(1)
代码实现
/*
*进行简单的选择排序
*/
#include<stdio.h>
#define MaxSize 100
/*
*进行选择排序
*/
void selectSort(int a[] , int length) ;
/*
*进行数组元素的交换
*/
void swap(int *a , int *b) ;
/*
*进行数组的显示
*/
void displayArray(int a[] , int length) ;
void main()
{
int a[MaxSize] , length , i ;
printf("Please input the length of the array : \n") ;
scanf("%d" , &length) ;
//进行数组元素的接收
for(i = 0 ; i < length ; i++)
{
scanf("%d" , &a[i]) ;
}
printf("Before sort... \n") ;
displayArray(a , length) ;
selectSort(a , length) ;
printf("After sort... \n") ;
displayArray(a , length) ;
}
void selectSort(int a[] , int length)
{
int i , j , k ;
for(i = 0 ; i < length - 1 ; i++)
{
k = i ;
for(j = i + 1 ; j < length ; j++)
{
if(a[j] < a[k])
{
k = j ;
}
}
if(k != i)
{
swap(&a[i] , &a[k]) ;
}
}
}
void swap(int *a , int *b)
{
int temp ;
temp = *a ;
*a = *b ;
*b = temp ;
}
void displayArray(int a[] , int length)
{
int i ;
for(i = 0 ; i < length ; i++)
{
printf("%4d " , a[i]) ;
}
printf("\n") ;
}
二、堆排序
堆排序即根据数组所在下标建立完全二叉树,根节点的节点值要大于他的孩子节点,每次取出树的根节点与当前数组的最末位进行交换,并重建堆,最终即可得到有序数组。
1、平均时间复杂度与最好最坏时间复杂度都是O(nlogn)
2、空间复杂度为O(1)
数组0位不存储元素
代码实现
/*
*进行数组的对排序
*/
#include<stdio.h>
#define MaxSize 100
/*
*重建堆的过程
*/
void sift(int a[] , int k , int m) ;
/*
*建初堆
*/
void crt_heap(int a[] , int length) ;
/*
*堆排序过程
*/
void heapSort(int a[] , int length) ;
/*
*进行元素的交换
*/
void swap(int *a , int *b) ;
/*
*进行数组的显示
*/
void displayArray(int a[] , int length) ;
void main()
{
int a[MaxSize] , length , i ;
printf("Please input the length of the array : \n") ;
scanf("%d" , &length) ;
//进行数组元素的接收
for(i = 1 ; i <= length ; i++)
{
scanf("%d" , &a[i]) ;
}
printf("Before sort... \n") ;
displayArray(a , length) ;
heapSort(a , length) ;
printf("After sort... \n") ;
displayArray(a , length) ;
}
void sift(int a[] , int k , int m)
{
int i , temp , finished ;
temp = a[k] ;
finished = 0 ;
i = 2 * k ;
while(i <= m && !finished)
{
if(i < m && a[i] < a[i + 1])//如果存在右子树且右子树较大
{
i = i + 1 ;
}
if(a[k] > a[i])
{
finished = 1 ;
}else{
a[k] = a[i] ;
k = i ;
i = 2 * i ;
}
}
a[k] = temp ;
}
void crt_heap(int a[] , int length)
{
int i ;
for(i = length / 2 ; i >= 1 ; i--)
{
sift(a , i , length) ;
}
}
void heapSort(int a[] , int length)
{
int i ;
crt_heap(a , length) ; //建初堆
for(i = 1 ; i <= length ; i++)
{
swap(&a[1] , &a[length - i + 1]) ;
crt_heap(a , length - i) ;
}
}
void swap(int *a , int *b)
{
int temp ;
temp = *a ;
*a = *b;
*b = temp ;
}
void displayArray(int a[] , int length)
{
int i ;
for(i = 1 ; i <= length ; i++)
{
printf("%4d " , a[i]) ;
}
printf("\n") ;
}