1、冒泡排序
分为单向起泡和双向起泡,单向可分为普通算法和改进算法
2、快速排序
快速排序思想:分治法(挖坑填数法+分治法)
排序效率:O(N*logN) 较高
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
12 | 9 | 13 | 11 | 20 | 17 | 15 | 10 | 18 |
初始时:i=0; j=4; t=Array[0]=12作为基准
从右向左:找到一个比t小的数,当j=7时,存放到Array[0]中
从左往右:找到一个比t大的数,当i=2时,存放到Array[7]中
最后将基准存放到Array[2]中
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
10 | 9 | 13 | 11 | 20 | 17 | 15 | 13 | 18 |
重复以上步骤,直到 i>=j
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
10 | 9 | 11 | 12 | 20 | 17 | 15 | 13 | 18 |
再进行函数递归Array[0]到Array[2] 和 Array[4]到Array[8]
#include <stdio.h> #include <stdlib.h> int Partition(int *Array,int i,int j); void QuickSort(int *Array,int Low,int High); void main() { int i,n; int Array[255]; printf("请输入数据的个数:"); scanf("%d",&n); if(n<0||n>255) { printf("n is not correct! "); exit(1); } printf("请依次输入待排序数据: "); for(i=0;i<n;i++) scanf("%d",(Array+i)); printf(" 请输出待排序数据 "); for(i=0;i<n;i++) printf("%d ",*(Array+i)); QuickSort(Array,0,n-1); printf(" 请输出排序数据数据 "); for(i=0;i<n;i++) printf("%d ",*(Array+i)); //printf(" "); } int Partition(int *Array,int i,int j) { int t=*(Array+i); //用第1位作基准,*(Array+0) while(i<j) { while(i<j&&*(Array+j)>=t) j--; if(i<j) { *(Array+i)=*(Array+j); i++; } while(i<j&&*(Array+i)<=t) i++; if(i<j) { *(Array+j)=*(Array+i); j--; } } *(Array+i)=t; return i; } void QuickSort(int *Array,int Low,int High) { int mid; if(Low<High) { mid=Partition(Array,Low,High); QuickSort(Array,Low,mid-1); QuickSort(Array,mid+1,High); } }
3、直接选择排序
void Selectsort(int *Array,int n) { for(int i=0;i<n-1:i++) { int m=i; for(int j=i+1;j<n;j++) { if(*(Array+j)<*(Array+m)) m=j; } if(m!=i) { int a=*(Array+m); *(Array+m)=*(Array+i); *(Array+i)=a; } } }
4、直接插入排序
第一次插入:Array[1]与Array[0]进行比较
第 i 次插入:先是Array[i]与Array[i-1]进行比较,如果小于,则将第Array[i-1]后移一位;如果大于则查找结束。
#include <stdio.h> #include <stdlib.h.> void InsertSort(int *Array,int n); void main() { int i, n; int Array[255]; printf("请输入待输入数据个数:"); scanf("%d",&n); printf(" 请输入待输入数据 "); for(i=0;i<n;i++) scanf("%d",(Array+i)); printf(" 输出待排序数据 "); for(i=0;i<n;i++) printf("%d ",*(Array+i)); InsertSort(Array,n); printf(" 输出排序好的数据 "); for(i=0;i<n;i++) printf("%d ",*(Array+i)); } void InsertSort(int *Array,int n) { int i,j,temp; for(i=1;i<n;i++) { if(*(Array+i)<*(Array+i-1)) { j=i-1; temp=*(Array+i); do //do while可改成for(j=i-1;j>0&&*Array[j]>temp;j--); { // Array[j+1]=Array[j]; *(Array+j+1)=*(Array+j); j--; }while(temp<*(Array+j)); *(Array+j+1)=temp; } } }
5、希尔排序
6、堆排序
7、归并排序
图片来自<https://www.cnblogs.com/chengxiao/p/6194356.html#4002669>
#include<stdio.h> void MergePass(int *a,int *b,int t,int n) { int i,j,index; int beg1,end1; int beg2,end2; beg1=0;index=0; while(beg1+t<=n-1) { beg2=beg1+t; end1=beg2-1; if(beg2+t-1<=n-1) end2=beg2+t-1; else end2=n-1; i=beg1; j=beg2; while(i<=end1&&j<=end2) { if(*(a+i)<=*(a+j)) { *(b+index)=*(a+i); i++; index++; } else { *(b+index)=*(a+j); j++; index++; } } while(i<=end1) { *(b+index)=*(a+i); index++; i++; } while(j<=end2) { *(b+index)=*(a+j); index++; j++; } beg1=end2+1; } for(i=beg1;i<n;index++) *(b+index)=*(a+i); } void MergeSort(int *a,int *b,int n) { int i,j,count; j=1;count=1; while(j<n) { MergePass(a,b,j,n); for(i=0;i<n;i++) *(a+i)=*(b+i); j*=2; } } void main() { int Array[]={10,50,20,30,40,60,90,80}; int y[8]; int i; MergeSort(Array,y,8); for(int i=0;i<8;i++) printf("%d ",*(Array+i)); }
程序二:(转自https://blog.csdn.net/morewindows/article/details/6678165白话算法之归并算法的实现)
#include <iostream> using namespace std; void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } } //bool MergeSort(int a[], int n) //{ // int *p = new int[n]; // if (p == NULL) // return false; // mergesort(a, 0, n - 1, p); // delete[] p; // return true; //} int main() { int Array[]={8,4,5,7,1,3,6,2}; int n=8; int *p=new int [n]; mergesort(Array, 0, n - 1, p); for (int i = 0; i < n; i++) cout<<" "<<Array[i]; }
(待续中...........)