以前做排序为了省事直接在创建在*.cpp里,今天遇到问题了。 这段代码在g++下运行正确,输出为12345 但在gcc下运行错误,输出为00235。 应该错在这句话:array[j]^=array[j+1]^=array[j]^=array[j+1];
疑问:不知两种编译下,是异或运算有区别?还是gcc有特殊的序列点? 不了解其中本质。 一个数(同一个地址)自己与自己异或3次会是0,但下角标是j和j+1,应该不会涉及到这种情况。
很久以前从网上扒下来的
#include<stdio.h>#include<math.h>void shellInsert(int array[],int n,int dk)///根据当前增量dk进行插入排序{ int i,j,temp; for(i=dk; i<n; i++) //分别向每组的有序区域插入 { temp=array[i]; for(j=i-dk; (j>=i%dk)&&array[j]>temp; j-=dk) //比较与记录后移同时进行 array[j+dk]=array[j]; if(j!=i-dk) array[j+dk]=temp;//插入 }}void shellSort(int array[],int n,int t)///希尔排序{ int dk = n/2; while( dk >= 1 ){ shellInsert(array, n, dk); dk = dk/2; }}int main(){ int array[100],i,n; scanf("%d",&n); for(i=0; i<n; i++) scanf("%d",&array[i]); shellSort(array,n,int(log(n+1)/log(2)));//排序趟数应为log2(n+1)的整数部分 for(i=0; i<n; i++) printf("%d ",array[i]); printf("/n");}一个循环…但是变量i跑的太折腾了…
#include<stdio.h>void gnomesort(int array[],int arraySize){ int i=0; while(i<arraySize) { if(i==0||array[i-1]<=array[i])i++; else { int tmp = array[i]; array[i] = array[i-1]; array[--i] = tmp; } }}int main(){ int array[5]= {4,3,1,5,2}; gnomesort(array,5);/*排序后结果为1 2 3 4 5*/ for(int i=0; i<5; i++)printf("%d ",array[i]);}计数排序是一个非基于比较的排序算法
#include <stdio.h>#include <string.h>#define MAXNUM 1000//排序的数字范围是0-1000void countingSort(int A[], int n, int k){ int temp[k], out[n],i; memset(temp,0,sizeof(temp)); for (i = 0; i < n; i++) temp[A[i]]++; for (i = 1; i < k; i++) temp[i] += temp[i-1]; for (i = n - 1; i >= 0; i--) out[--temp[A[i]]] = A[i]; memcpy(A,out,sizeof(out));}int main(){ int A[5]= {3,1,5,4,2},i; countingSort(A, 5, MAXNUM); for (i = 0; i < 5; i++)printf("%d ", A[i]);}新闻热点
疑难解答