这里用c语言介绍比较常用的排序算法:冒泡法,交换法,选择法,插入法和快速排序这五种排序算法,并计算算法的时间复杂度。
代码如下:
#include <stdio.h> void printList(int a[]){ for (int i = 0; i<10; i++) { printf(" %d",a[i]); } printf(" "); } void bubbleSort(int a[]){ for (int i = 0 ; i<10; i++) { for (int j = 9; j>i; j--) { if (a[j]<a[j-1]) { int timp = a[j-1]; a[j-1] =a[j]; a[j] = timp; } } } } void exchangeSort(int a[]){ for (int i = 0; i<10; i++) { for (int j = 9 ; j>i; j--) { if (a[i]>a[j]) { int timp = a[i]; a[i] =a[j]; a[j] = timp; } } } } void selectSort(int a[]){ for (int i = 0; i<10; i++) { int minIndex = i; for (int j = 9 ; j>i; j--) { if (a[j]<a[minIndex]) { minIndex = j; } } int timp = a[minIndex]; a[minIndex] =a[i]; a[i] = timp; } } void insertSort(int a[]){ for (int i = 1; i<10; i++) { if (a[i]<a[i-1]) { int j = i; int temp = a[i]; while (a[j-1]>temp&&j>0) { a[j] = a[j-1]; j--; } a[j] = temp; } } } void quickSort(int a[] , int left ,int right){ if (left>right) { return; } int i = left; int j = right; int p = a[i]; while(i < j) { while(i< j && p <a[j]) { j --; } a[i] = a[j]; while(i < j && p >a[i]) { i ++; } a[j] = a[i]; } a[i] = p; quickSort(a,left,i -1); quickSort(a,i +1, right); } int main(int argc, const char * argv[]) { int a[] = {9,8,7,6,5,4,3,2,1,0}; printf("初始化数组 "); printList(a); // bubbleSort(a); // exchangeSort(a); // selectSort(a); // insertSort(a); quickSort(a,0,9); printf("排序后数组 "); printList(a); return 0; }
时间复杂度及方法核心思想
1.冒泡法:通过相邻两个数的两两比较大小。算法的时间复杂度:O(n^2)
2.交换法:从前往后比较,遇到较小的交换。算法的时间复杂度:O(n^2)
3.选择法:选择一个最小(或最大)的进行交换。算法的时间复杂度:O(n^2)
4.插入法:选择一个最小(或最大)的插入到合适的位置。算法的时间复杂度:O(n^2)
5.快速排序法:从中找出一个中间数,比改数大的和小的防止该数的两侧。利用递归一次进行。算法的时间复杂度:O(nlogn)