标签:
交换排序(冒泡排序、快速排序)
插入排序(直接插入排序、希尔排序)、
选择排序(直接选择、堆排序)
归并排序
基排序
时间复杂度:最优情况下是O(n),最坏情况和平均情况是O(n2)
空间复杂度:O(1)
稳定
算法实现是
#include<stdio.h> void main() { int a[6]={2,1,5,3,6,7}; int temp=0; int i=0; int j=0; int m=0; for(;i<6;i++) for(j=i;j<6-i;j++) { if(a[j+1]<a[j]) { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } for(;m<6;m++) { printf("%d ",a[m]); } }
从小到大排序 结果是1 2 3 5 6 7
时间复杂度:最好情况是O(nlogn)、最坏情况是O(n2)、平均情况是O(nlogn)
空间复杂度:O(nlogn)
不稳定
#include<stdio.h> void sort(int *a, int left, int right) { int i = left; int j = right; int key = a[left]; int m=0; if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/ { for(m=0;m<6;m++) printf("%d ",a[m]); printf("\n"); return ; } while(i < j) /*控制在当组内寻找一遍*/ { while(i < j && key <= a[j]) /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升 序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ { j--;/*向前寻找*/ } a[i] = a[j]; /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是 a[left],那么就是给key)*/ while(i < j && key >= a[i]) /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反, 因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/ { i++; } a[j] = a[i]; } a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/ sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/ sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/ /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/ } void main() { int a[6]={2,1,5,3,6,7}; sort(a,0,5); }
时间复杂度:最好是O(n)、最坏是O(n2)、平均是O(n2)
空间复杂度:O(1)
稳定
#include<stdio.h>
int main()
{
int a[]={98,76,109,34,67,190,80,12,14,89,1};
int k=sizeof(a)/sizeof(a[0]);
int j;
int i=1;
int f=0;
for(;i<k;i++)//循环从第2个元素开始
{
if(a[i]<a[i-1])
{
int temp=a[i];
for(j=i-1;j>=0 && a[j]>temp;j--)//依次和前面的元素比较大小
{
a[j+1]=a[j];
}
a[j+1]=temp;//此处就是a[j+1]=temp;
}
return 0;
}
时间复杂度:最好是O(n)、最坏是O(n2)、平均是O(n1.3)
空间复杂度:O(1)
不稳定
#include<stdio.h> #include<math.h> void shellsort3(int a[], int n) { int i, j, gap; int m=0; int temp=0; for (gap = n / 2; gap > 0; gap /= 2) { printf("%d\n",gap); for (i = gap; i < n; i++) for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap) { temp=a[j]; a[j]=a[j+gap]; a[j+gap]=temp; printf("%d,%d\n",j,j+gap); for(m=0;m<10;m++) printf("%d ",a[m]); printf("\n"); } } } void main() { int a[10] ={49,38,65, 97 , 26, 13 , 27, 49 , 55 , 4}; shellsort3(a,10); }
时间复杂度:都是O(n2)
空间复杂度:O(1)
不稳定
直接选择排序(Straight Select Sorting) 也是一种简单的排序方法,它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值, 与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1] 中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列·
#include<stdio.h> void SelectSort(int R[], int n) { int i, j, m; int t; for(i=0; i<n-1; i++) { m = i; for(j = i+1; j < n; j++) { if(R[j] < R[m]) m = j; } if(m != i) { t = R[i]; R[i] = R[m]; R[m] = t; } } } void main() { int a[6]={2,1,5,3,6,7}; int i=0; SelectSort(a,6); for(;i<6;i++) printf("%d ",a[i]); }
时间复杂度:O(nlogn)
空间复杂度:O(1)
不稳定
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
#include <stdio.h> //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度 //本函数功能是:根据数组array构建大根堆 void HeapAdjust(int array[],int i,int nLength) { int nChild; int nTemp; for(;2*i+1<nLength;i=nChild) { //子结点的位置=2*(父结点位置)+1 nChild=2*i+1; //得到子结点中较大的结点 if(nChild<nLength-1&&array[nChild+1]>array[nChild])++nChild; //如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点 if(array[i]<array[nChild]) { nTemp=array[i]; array[i]=array[nChild]; array[nChild]=nTemp; } else break; //否则退出循环 } } //堆排序算法 void HeapSort(int array[],int length) { int i; //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素 //length/2-1是最后一个非叶节点,此处"/"为整除 for(i=length/2-1;i>=0;--i) HeapAdjust(array,i,length); //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 for(i=length-1;i>0;--i) { //把第一个元素和当前的最后一个元素交换, //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的 array[i]=array[0]^array[i]; array[0]=array[0]^array[i]; array[i]=array[0]^array[i]; //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 HeapAdjust(array,0,i); } } int main() { int i; int num[]={9,8,7,6,5,4,3,2,1,0}; HeapSort(num,sizeof(num)/sizeof(int)); for(i=0;i<sizeof(num)/sizeof(int);i++) { printf("%d ",num[i]); } printf("\nok\n"); return 0; }
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定
#include <stdlib.h> #include <stdio.h> void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex) { int i = startIndex, j=midIndex+1, k = startIndex; while(i!=midIndex+1 && j!=endIndex+1) { if(sourceArr[i] >= sourceArr[j]) tempArr[k++] = sourceArr[j++]; else tempArr[k++] = sourceArr[i++]; } while(i != midIndex+1) tempArr[k++] = sourceArr[i++]; while(j != endIndex+1) tempArr[k++] = sourceArr[j++]; for(i=startIndex; i<=endIndex; i++) sourceArr[i] = tempArr[i]; } //内部使用递归 void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex) { int midIndex; if(startIndex < endIndex) { midIndex = (startIndex + endIndex) / 2; MergeSort(sourceArr, tempArr, startIndex, midIndex); MergeSort(sourceArr, tempArr, midIndex+1, endIndex); Merge(sourceArr, tempArr, startIndex, midIndex, endIndex); } } int main(int argc, char * argv[]) { int a[8] = {50, 10, 20, 30, 70, 40, 80, 60}; int i, b[8]; MergeSort(a, b, 0, 7); for(i=0; i<8; i++) printf("%d ", a[i]); printf("\n"); return 0; }
时间复杂度为O (nlog(r)m)
#include<math.h> testBS() { inta[] = {2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3}; int *a_p = a; //计算数组长度 intsize = sizeof(a) / sizeof(int); //基数排序 bucketSort3(a_p, size); //打印排序后结果 inti; for(i = 0; i < size; i++) { printf("%d\n", a[i]); } intt; scanf("%d", t); } //基数排序 voidbucketSort3(int *p, intn) { //获取数组中的最大数 intmaxNum = findMaxNum(p, n); //获取最大数的位数,次数也是再分配的次数。 intloopTimes = getLoopTimes(maxNum); inti; //对每一位进行桶分配 for(i = 1; i <= loopTimes; i++) { sort2(p, n, i); } } //获取数字的位数 intgetLoopTimes(intnum) { intcount = 1; inttemp = num / 10; while(temp != 0) { count++; temp = temp / 10; } returncount; } //查询数组中的最大数 intfindMaxNum(int *p, intn) { inti; intmax = 0; for(i = 0; i < n; i++) { if(*(p + i) > max) { max = *(p + i); } } returnmax; } //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果 voidsort2(int *p, intn, intloop) { //建立一组桶此处的20是预设的根据实际数情况修改 intbuckets[10][20] = {}; //求桶的index的除数 //如798个位桶index=(798/1)%10=8 //十位桶index=(798/10)%10=9 //百位桶index=(798/100)%10=7 //tempNum为上式中的1、10、100 inttempNum = (int)pow(10, loop - 1); inti, j; for(i = 0; i < n; i++) { introw_index = (*(p + i) / tempNum) % 10; for(j = 0; j < 20; j++) { if(buckets[row_index][j] == NULL) { buckets[row_index][j] = *(p + i); break; } } } //将桶中的数,倒回到原有数组中 intk = 0; for(i = 0; i < 10; i++) { for(j = 0; j < 20; j++) { if(buckets[i][j] != NULL) { *(p + k) = buckets[i][j]; buckets[i][j] = NULL; k++; } } } }
标签:
原文地址:http://www.cnblogs.com/rainhome/p/5347698.html