冒泡排序(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
*/