您的位置:首页 > 编程语言

几个常见排序算法的代码实现(复习)

2013-04-14 14:41 483 查看
#include<stdio.h>

#define ARR_SIZE 20

#include <iostream>

using namespace std;

void printArr(int arr[], int count){

for(int i = 0;i<count;i++){

printf("%d ",arr[i]);

}

printf("\n");

}

// Sort Funs

//插入排序

void InsertionSort( int arr[], size_t count )

{

if(arr == NULL || count <= 1) return;

for( int i = 1; i < count; i++ ) //从第二个元素开始

{

int tmp = arr[i],j = i;

for( ; j>0 && arr[j-1]>tmp; j-- ){

arr[j] = arr[j-1]; //挪位

}

arr[j] = tmp;

}

}

//选择排序

void SelectSort( int arr[], size_t count)

{

if(arr == NULL || count <= 1) return;

for( int i=0; i<count; i++)

{

int min = i;

for( int j=i; j<count; j++)

{

if( arr[j] < arr[min])

min = j;

}

int temp = arr[i];

arr[i] = arr[min];

arr[min] = temp;

}

}

//冒泡排序

void BubbleSort( int arr[], size_t count)

{

if(arr == NULL || count <= 1) return;

for( int i=0; i<count; i++)

{

for( int j = 1; j < count-i; j++){

if( arr[j] < arr[j-1]){

int temp = arr[j];

arr[j] = arr[j-1];

arr[j-1] = temp;

}

}

}

}

//快速排序

void QuickSort(int arr[], int left, int right)

{

if(arr == NULL || left >= right) return;

int temp = arr[left];

int i = left, j = right;

while (i < j) //若条件为i<=j,则将所有判定都加等号则会发生死循环

{

while ( i<j && arr[j] > temp ) j--;

if(i < j) arr[i++]=arr[j];

while ( i<j && arr[i] < temp ) i++;

if (i < j) arr[j--] = arr[i];

}

arr[i] = temp;

if(i-left > 1)

QuickSort(arr, left, i-1);

if(right - i > 1)

QuickSort(arr, i+1, right);

}

//计数排序

void CountingSort(int arr[], int count)

{

if(arr == NULL || count <= 1) return;

int i, min, max;

min = max = arr[0];

for(i = 1; i < count; i++) {

if (arr[i] < min)

min = arr[i];

else if (arr[i] > max)

max = arr[i];

}

int range = max - min + 1;

int *countArr = (int*)malloc(range * sizeof(int));

for(i = 0; i < range; i++)

countArr[i] = 0;

for(i = 0; i < count; i++)

countArr[ arr[i] - min ]++;

int index = 0;

for(i=0; i<range ;i++){

int sum = countArr[i];

while( sum-->0)

arr[index++]=i+min;

}

free(countArr);

}

//堆排序

#define LeftChild(i) (2*(i)+1)

void HeapAdjust( int arr[], int i, int N )

//对数组A中以下标为i的元素作为根,大小为N的元素序列构成的堆进行堆调整,使该根节点放到合适的位置

{

int Child;

int tmp;

for( tmp = arr[i]; LeftChild(i) < N; i = Child )

{

Child = LeftChild(i);

if( Child !=N-1 && arr[Child+1] > arr[ Child ] )

Child++; //使Child指向两个子女中大的那一个

if( tmp < arr[ Child ] ) //大堆

arr[i] = arr[Child];

else

break;

}

arr[i] =tmp;

}

void Heapsort( int A[], int N )

{

int i;

for( i = N/2; i >= 0; i-- ) /* BuildHeap */

HeapAdjust( A, i, N );

for( i = N-1; i > 0; i-- )

{

int temp = A[0];

A[0]=A[i];

A[i]=temp;

HeapAdjust( A, 0, i );

}

}

int main(int argc, char *argv[])

{

int arr[ARR_SIZE]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};

//int arr[ARR_SIZE]={10,36,53,72,92,11,13,15,17,19,27,48,69,81,120,112,14,16,18,20};

//int arr[ARR_SIZE]={1,3,5,4,5,11,11,15,15,16,2,4,6,8,10,12,15,16,15,20};

printArr(arr,ARR_SIZE);

Heapsort(arr,ARR_SIZE);

printArr(arr,ARR_SIZE);

getchar();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: