冒泡排序和插入排序(直接插入、折半插入、希尔排序)(殷人昆版)

来源:互联网 发布:mac怎么删除flash插件 编辑:程序博客网 时间:2024/06/02 14:35

一、普通实现冒泡排序

冒牌排序的基本思想是:设待排序元素序列中的元素个数为n,首先比较第n-2个元素和第n-1个元素,如果发生逆序,则交换两个元素。其余处理方式相同。

<span style="font-family:Microsoft YaHei;font-size:18px;"><strong>void BubbleSort(int V[], int n){for(int i = 0; i < n; ++i){for(int j = 1; j < n-i; ++j){if(V[j-1] > V[j]){int tmp = V[j-1];V[j-1] = V[j];V[j] = tmp;}}}}</strong></span>


二、加入bool标志避免顺序已排好还进行排序,浪费时间

加入bool值exchange用以标志本趟循环是否交换数据,若为false则直接结束。

<span style="font-family:Microsoft YaHei;font-size:18px;"><strong>void NewBubbleSort(int V[], int n){bool exchange;for(int i = 0; i < n; ++i){for(int j = 1; j < n-i; ++j){exchange = false;if(V[j-1] > V[j]){int tmp = V[j-1];V[j-1] = V[j];V[j] = tmp;exchange = true;}}if(!exchange){return;}}}</strong></span>


三、直接插入排序

直接插入排序的基本思想:当插入第i(i>=1)个元素时,前面的V[0]、V[1],……,V[i-1]已经排好序。这时用V[i]的排序码与V[i-1],V[i-2],……的排序码顺序进行比较,找到插入排序即将V[i]插入,原来位置上的元素向后顺移。

<span style="font-family:Microsoft YaHei;font-size:18px;"><strong>void InsertSort(int V[], int left, int right){int i, j;for(i = left+1; i < right+1; ++i){if(V[i] < V[i-1]){int tmp = V[i];j = i-1;do{V[j+1] = V[j];j--;}while(j >= left && tmp < V[j]);//向后移位V[j+1] = tmp;}}}</strong></span>


四、折半插入排序(二分法插入排序)

折半插入排序(二分法插入排序)的基本思想:设有一个元素序列V[0]、V[1]、V[2]……V[n-1]。其中V[0]、V[1]、V[2]……V[i-1]都是已经排好序的元素。在插入V[i]时,利用折半搜索法寻找V[i]的插入位置。

<span style="font-family:Microsoft YaHei;font-size:18px;"><strong>void BinaryInsertSort(int V[], int left, int right){int tmp, i, low, high, middle, k;for(i = left+1; i < right+1; ++i){tmp = V[i];low  = left;high = i-1;while(low <= high){middle = (low+high)/2;if(tmp < V[middle]){high = middle-1;}else{low = middle+1;}}for(k = i-1; k >= low; --k)//向后移位,移开插入的位置{V[k+1] = V[k];}V[low] = tmp;//插入}}</strong></span>


五、希尔排序

希尔排序的基本思想:设待排序元素序列有n个,首先取整数gap<n作为间隔,将所有元素分为gap个子序列,所有距离为gap的元素放在一个子序列中,在每个子序列中分别实行直接插入排序。然后缩小间隔gap,直至gap==1,将所有的元素放在同一序列为止。

<span style="font-family:Microsoft YaHei;font-size:18px;"><strong>void ShellSort(int V[], int left, int right){int i, j, gap = right-left+1, tmp;do{gap = gap/3+1;//求下一增量for(i = left+gap; i < right+1; ++i){if(V[i] < V[i-gap]){tmp = V[i];j = i-gap;do{V[j+gap] = V[j];//后移元素j = j-gap; //再比较前一元素}while(j >= left && tmp < V[j]);V[j+gap] = tmp;}}}while(gap > 1);}</strong></span>



0 0
原创粉丝点击