排序

冒泡排序(bubble sort):每一次比较,将最大值放在最后,再次比较时,比较范围缩小一位。

插入排序法(insert sort):(1)首先比较头两个元素的大小,并排序(2)将下一元素插入排好序的数组中,从最后一个比较,一边比较,一边插入,直至比它小的而停止。(3) 重复(2)。算法详细描述,参见《算法导论》(第三版)第二章。

快速排序法(quick sort):(1)选择一个分界值,大于等于分界值的元素集中到数组的某一部分,小于分界值的元素集中到数组的另一部分。(2)对于分出来的部分,重复这个过程,直到数组被排序完毕。算法详细描述,参见《算法导论》。

选择排序(select sort):排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素交换。对A中前n-1个元素按该方式继续。见《算法导论》(第三版)第二章.练习2.2-2

冒泡排序实现

// bubble sort : write time:2009

// vc 2005 express

#include <iostream>

using namespace std;

void bubble(char arr[], int len);

int main()

{   

 char arr[5] = {'b','e','d','c','a'};

 int len = 5;

 int i;

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

     cout << arr[i] << " ";

 cout << endl;

 bubble(arr, len);

}

void bubble(char arr[], int len)

{

 int i,j,temp;

 for( i=0; i<(len-1);i++)

 {

       for(j=0;j<(len-i-1);j++)

    {

     if( arr[j]>arr[j+1] )

     {

              temp = arr[j+1];

     arr[j+1] = arr[j];

     arr[j] = temp;

     }

    }

    for( int k=0;k<len;k++)

         cout << arr[k] << " ";

    cout << endl;

    }

}

/*

b e d c a

b d c a e

b c a d e

b a c d e

a b c d e

*/


冒泡排序实现

//ubuntu14  gcc c99   write time:2017
#include <stdio.h>

void bubble(char arr[],  int len);

int main()
{
	char arr[]={'b','e', 'd', 'c', 'a'};
	//printf("%ld\n", sizeof(arr));
	int count = sizeof(arr);
	bubble(arr, count);

	puts("result:");
	for(int i=0; i<count; i++)
		printf("%c\n", arr[i]);
		//putchar(arr[i]);
 
	return 0;
}

void bubble(char arr[],  int len)
{
	char temp = 0;
	int step = len;

	for(int j=1; j<len; j++) //compare n-1
	{
		step--;
		for(int i=0; i<step; i++)  //m=1, m++ , instead of [i+1]
		{
			if(arr[i]>arr[i+1])
			{
				temp = arr[i+1];
				arr[i+1] = arr[i];
				arr[i] = temp;
			}
		}
	
		for(int k=0; k<len; k++)
			printf("%c", arr[k]);

		printf("\n");
	}
}

/*
bdcae
bcade
bacde
abcde
result:
a
b
c
d
e
*/		

插入排序实现
//ubuntu14  gcc c99   write time:2017  
#include <stdio.h>

void insertSort(char arr[],  int len);

int main()
{
	char arr[]={'b','e','h','d','g','c','a'};
	//printf("%ld\n", sizeof(arr));
	int count = sizeof(arr);
	insertSort(arr, count);

	puts("result:");
	for(int i=0; i<count; i++)
		printf("%c\n", arr[i]);
 
	return 0;
}

void insertSort(char arr[],  int len)
{
	char key = 0;
	int  i = 0;
	for(int j=1; j<len; j++)
	{
		//max(i)+1=j
		key = arr[j];
		i = j-1; //not overflow	
		while(i>-1 && arr[i]>key) 
		{
			//move back
			arr[i+1] = arr[i];
			i--; 
		}
		//1)if entry while loop, i--, so i=i+1
		//2)if not entry while loop, then arr[i]<=key.so key insert j behind i. so i=i+1
		//arr[i]<=key
		arr[i+1] = key;
	}
}

/*
result:
a
b
c
d
e
g
h
*/		

快速排序
参照《算法导论》(第三版)第7章,快速排序伪码,实现了此算法。
#include <assert.h>
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>

void quickSort(char arr[], int p, int r);

int main()
{
		
	char arr[]={'9', '5', '2', '4', '7', '1', '8', '3', '2', '6'};
	int count = sizeof(arr);
	
	quickSort(arr, 0, count - 1);
	
	for(int i=0; i<count; i++)
		printf("%c", arr[i]);

	printf("\n");
	return 0;
}

//r is the index of last element.
static int partition(char arr[], int p, int r)
{
	char x = arr[r];
	char temp = 0;
	int i = p - 1;
	
	//for j=p to r-1
	for(int j=p; j<r; j++)
	{
		if(arr[j]<=x)
		{
			i++;
			
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}

	arr[r] = arr[i+1];
	arr[i+1] = x;
	return i+1;
}

void quickSort(char arr[], int p, int r)
{

	if(p<r)
	{
		int q = partition(arr, p, r);
		quickSort(arr, p, q-1);
		quickSort(arr, q+1, r);
	}
}



选择排序
//ubuntu14  gcc c99   write time:2017  
#include <stdio.h>

void selectSort(char arr[],  int len);

int main()
{
	char arr[]={'b','e','f','d','g','c','a'};
	//printf("%ld\n", sizeof(arr));
	int count = sizeof(arr);
	selectSort(arr, count);

	puts("result:");
	for(int i=0; i<count; i++)
		printf("%c\n", arr[i]);
 
	return 0;
}

void selectSort(char arr[],  int len)
{
	char temp = 0;
	int minIndex = 0;
	int count = len - 1;
	
	for(int i=0; i<count; i++) //loop n-1
	{
		minIndex = i;
		for(int j=i+1; j<len; j++)  //find min value in [i, n]
		{
			if(arr[minIndex]>arr[j])
				minIndex = j;
		}

		//change
		temp = arr[i];
		arr[i] = arr[minIndex];
		arr[minIndex] = temp;
	}
}

/*
result:
a
b
c
d
e
f
g
*/		



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值