一、快速排序 1.1 算法思想 先从数列中取出一个数作为key 值;将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;对左右两个小数列重复上一步,直至各区间只有 1 个数。 1.2 复杂程度 复杂程度:O( nlog(2n) ). 1.3程序 一次快速排序的算法的步骤如下: 1)设置两个变量 i、j,排序开始时 i=0、j=N-1。 2)以第一个数组元素 a[0](即a[i])作为基准元素。 3)从 j 开始从后往前搜索 (j--),找到第一个小于 a[i] 的数 a[j],将 a[j] 和 a[i] 互换位置,此时基准元素的位置在数组的第 j 个位置。 4)从 i 开始从前向后搜索 (i++),找到第一个大于 a[j] 的 a[i],将 a[i] 和 a[j] 互换位置,此时基准元素的位置在数组的第 i个位置。 5)重复 3、4,直到 i=j,此时循环结束 #include void sort(int a[],int left ,int right) { int i,j,temp; i=left; j=right; temp=a[left]; if(left>right) return; while(i != j) //i不等于j时,循环进行 { while(a[j] >= temp && j > i) j --; if(j > i) a[i++]=a[j]; while(a[i]<=temp && j>i) i++; if(j>i) a[j--]=a[i]; } a[i]=temp; sort(a,left,i-1); //对小于基准元素的部分进行快速排序 sort(a,i+1,right); //对大于基准元素的部分进行快速排序 } int main() { int m[1000]; int n,i=0; scanf(“%d”,&n); for(i = 0;i < n;I ++) { scanf(“%d”,&m[i]); } sort(m,0,n - 1); printf("从小到大排序后:\n"); for(i=0;ia[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; f=0; } } if(1==f) //f为1说明没进行过冒泡,说明序列有序 break; //若序列有序,则跳出排序即可 } 2.4 运行时间结果(以一道题为例) #include int main(void) { int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500}; int n,i,j,buf; n = sizeof(a) / sizeof(a[0]); for (i=0; i #include void swap(int* a, int* b) { int temp = *b; *b = *a; *a = temp; } void max_heapify(int arr[], int start, int end) { //建立父节点指标和子节点指标 int dad = start; int son = dad * 2 + 1; while (son <= end) //若子节点指标在范围内才做比较 { if (son + 1 <= end && arr[son] < arr[son + 1]) //先比较两个子节点大小,选择最大的 son++; if (arr[dad] > arr[son]) //如果父节点大於子节点代表调整完毕,直接跳出函数 return; else //否则交换父子内容再继续子节点和孙节点比较 { swap(&arr[dad], &arr[son]); dad = son; son = dad * 2 + 1; } } } void heap_sort(int arr[], int len) { int i; //初始化,i从最後一个父节点开始调整 for (i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); //先将第一个元素和已排好元素前一位做交换,再重新调整,直到排序完毕 for (i = len - 1; i > 0; i--) { swap(&arr[0], &arr[i]); max_heapify(arr, 0, i - 1); } } int main() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 }; int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); int i; for (i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n"); return 0; } 3.4 运行时间结果 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 -------------------------------- Process exited after 0.01928 seconds with return value 0 请按任意键继续. . . 四、二路排序(这个一般是二路归并排序,在这里写归并排序)。 4.1 基本思想 将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素。将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素.重复步骤2,直到所有元素排序完毕 4.2 复杂程度 归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间. 4.3 程序 #include #include #define N 7 void merge(int arr[], int low, int mid, int high){ int i, k; int *tmp = (int *)malloc((high-low+1)*sizeof(int)); //申请空间,使其大小为两个 int left_low = low; int left_high = mid; int right_low = mid + 1; int right_high = high; for(k=0; left_low<=left_high && right_low<=right_high; k++){ // 比较两个指针所指向的元素 if(arr[left_low]<=arr[right_low]){ tmp[k] = arr[left_low++]; }else{ tmp[k] = arr[right_low++]; } } if(left_low <= left_high){ //若第一个序列有剩余,直接复制出来粘到合并序列尾 //memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int)); for(i=left_low;i<=left_high;i++) tmp[k++] = arr[i]; } if(right_low <= right_high){ //若第二个序列有剩余,直接复制出来粘到合并序列尾 //memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int)); for(i=right_low; i<=right_high; i++) tmp[k++] = arr[i]; } for(i=0; i> 1); merge_sort(arr, first, mid); merge_sort(arr, mid+1,last); merge(arr,first,mid,last); } return 0; } int main(){ int i; int a[N]={32,12,56,78,76,45,36}; printf ("排序前 \n"); for(i=0;i int shsort(int s[], int n)//自定义函数 shsort() { int i,j,d; d=n/2; //确定固定增虽值 while(d>=1) { for(i=d+1;i<=n;i++) //数组下标从d+1开始进行直接插入排序 { s[0]=s[i]; //设置监视哨 j=i-d; //确定要进行比较的元素的最右边位置 while((j>0)&&(s[0] int insort(int s[], int n) /* 自定义函数 insort()*/ { int i,j; for(i=2;i<=n;i++) //数组下标从2开始,s[0]做监视哨,s[1]一个数据无可比性 { s[0]=s[i]; //给监视哨陚值 j=i-1; //确定要比较元素的最右边位黄 while(s[0] #include #include #include void csort(int *src,int *dst,int size,int k) { int i; int *count = malloc(size*sizeof(int)); for(i=0;i void solve(int a[],int n) { int i,j,t; for(i=0;ia[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } } int main() { int a[100],n,i; scanf("%d",&n); for(i=0;i #include int a[11]={0,3,78,67,45,90,34,6,35,90,98}; void InSertSort(int a[],int length) { int i,j; for(i=2;ia[0];j--) { a[j+1]=a[j]; } a[j+1]=a[0]; } } void Print(int a[],int length) { int i; for(i=0;i void radixSort(int *a,int size) { int temp[10][20]={0}; //第一个10表示0~9,第二个20表示a的size int order[10]={0}; int i,j,k; //k表示当前比较的那一位上的具体数字 int n; //n=1,10,100,1000...取决于a中的最大的数 int p; n=1; while(n <= 100) { for(i=0;i left; j-- ) { num[j] = num[j - 1]; } num[left] = temp; } } } 11.4 运行时间结果 下面在测试一下随机生成10000个数据排序需要的次数和时间 insertSortBinary test共执行了9891次!执行时间为129ms