冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
#include <stdio.h>void bubbleSort(int arr[], int count){int i = count, j;int temp;while(i > 0){for(j = 0; j < i - 1; j++){if(arr[j] > arr[j + 1]){ temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}i--;}}int main(int arc, char* const argv[]){int arr[] = {5, 4, 1, 3, 6};bubbleSort(arr, 5);int i;for(i = 0; i < 5; i++)printf("%4d", arr[i]);}选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理如下。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
#include <stdio.h>int main(){int a[]={2,3,4,5,1,7,0,9};int len=sizeof(a)/sizeof(a[0]);select_sort(a,len);for(int i=0;i<len;i++){printf("%d ",a[i]);}return 0;}void select_sort( int *a, int n){register int i, j, min, t;for( i = 0; i < n - 1; i ++){min = i;//查找最小值for( j = i + 1; j < n; j ++)if( a[ min] > a[ j])min = j;//交换if( min != i){t = a[ min];a[ min] = a[ i];a[ i] = t;}}}插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
#include <stdio.h>#include <stdlib.h>int main(){int a[]={1,3,2,13,34,45,16,10};int length=8;InsertSort(a,8);for(int i=0;i<length;i++){printf("%d ",a[i]);}return 0;}void InsertSort(int a[],int length){int i,j,temp=0;//分别为有序区和无序区指针for(i=1;i<length;i++)//逐步扩大有序区{temp=a[i];//存储待排序元素for(j=i;j>0&&temp<a[j-1];--j){a[j]=a[j-1];}a[j]=temp;//将元素插入}}希尔排序是基于插入排序的以下两点性质而提出改进方法的:1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位#include <stdio.h>#include <stdlib.h>void shellsort(int *a,int n){int h, j, k, t;for (h=n/2; h>0; h=h/2) /*控制增量*/{for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/{t = *(a+j);for (k=j-h; (k>=0 && t<*(a+k)); k-=h){*(a+k+h) = *(a+k);}*(a+k+h)=t;}}}int main(){int a[]= {8,10,3,5,7,4,6,1,9,2};int N=sizeof(a)/sizeof(a[0]);shellsort(a,N);for(int k = 0;k < N;k++)printf("a[%d] = %d\n",k,a[k]);return 0;}/*int main(){const int n = 5;int i, j, temp;int gap = 0;int a[] = {5, 4, 3, 2, 1};while (gap<=n){gap = gap * 3 + 1;}while (gap > 0){for ( i = gap; i < n; i++ ){j = i - gap;temp = a[i];while (( j >= 0 ) && ( a[j] > temp )){a[j + gap] = a[j];j = j - gap;}a[j + gap] = temp;}gap = ( gap - 1 ) / 3;}}*/快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:1.从数列中挑出一个元素,称为"基准"(pivot),2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。
这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。
虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
#include <stdlib.h>#include <stdio.h>#define NUM_ITEMS 100void quickSort(int numbers[], int array_size); void q_sort(int numbers[], int left, int right); int numbers[NUM_ITEMS];int main(){int i;//seed random number generatorsrand(getpid());//fill array with random integersfor (i = 0; i < NUM_ITEMS; i++)numbers[i] = rand();//perform quick sort on arrayquickSort(numbers, NUM_ITEMS);printf("Done with sort.\n");for (i = 0; i < NUM_ITEMS; i++)printf("%i<", numbers[i]);}void quickSort(int numbers[], int array_size) {q_sort(numbers, 0, array_size - 1);}void q_sort(int numbers[], int left, int right) {int pivot, l_hold, r_hold;l_hold = left;r_hold = right;pivot = numbers[left];while (left < right){while ((numbers[right] >= pivot) && (left < right))right--;if (left != right){numbers[left] = numbers[right];left++;}while ((numbers[left] <= pivot) && (left < right))left++;if (left != right){numbers[right] = numbers[left];right--;}}numbers[left] = pivot;pivot = left;left = l_hold;right = r_hold;if (left < pivot)q_sort(numbers, left, pivot-1);if (right > pivot)q_sort(numbers, pivot+1, right);}选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理如下。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
#include <stdio.h>int main(){int a[]={2,3,4,5,1,7,0,9};int len=sizeof(a)/sizeof(a[0]);select_sort(a,len);for(int i=0;i<len;i++){printf("%d ",a[i]);}return 0;}void select_sort( int *a, int n){register int i, j, min, t;for( i = 0; i < n - 1; i ++){min = i;//查找最小值for( j = i + 1; j < n; j ++)if( a[ min] > a[ j])min = j;//交换if( min != i){t = a[ min];a[ min] = a[ i];a[ i] = t;}}}基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。