日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

数据结构:排序算法之交换排序(冒泡排序、快速排序)

發布時間:2023/12/20 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:排序算法之交换排序(冒泡排序、快速排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、冒泡

void bubbleSort(int a[], int n){for(int i =0 ; i< n-1; ++i) {for(int j = 0; j < n-i-1; ++j) {if(a[j] > a[j+1]){int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp;}}} }/*1.設置一標志性變量pos,用于記錄每趟排序中最后一次進行交換的位置。由于pos位置之后的記錄均已交換到位,故在進行下一趟排序時只要掃描到pos位置即可。 改進后算法如下: */ void Bubble_1 ( int r[], int n) {int i= n -1; //初始時,最后位置保持不變while ( i> 0) { int pos= 0; //每趟開始時,無記錄交換for (int j= 0; j< i; j++)if (r[j]> r[j+1]) {pos= j; //記錄交換的位置 int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} i= pos; //為下一趟排序作準備} }/*2.傳統冒泡排序中每一趟排序操作只能找到一個最大值或最小值,我們考慮利用在每趟排序中進行正向和反向兩遍冒泡的方法一次可以得到兩個最終值(最大者和最小者) , 從而使排序趟數幾乎減少了一半。 改進后的算法實現為: */ void Bubble_2 ( int r[], int n){int low = 0; int high= n -1; //設置變量的初始值int tmp,j;while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (r[j]> r[j+1]) {tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} --high; //修改high值, 前移一位for ( j=high; j>low; --j) //反向冒泡,找到最小者if (r[j]<r[j-1]) {tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;}++low; //修改low值,后移一位} }

2、快速排序

#include <iostream> #include <stack> using namespace std;int GetKeyIndex(int array[], int left, int right) {int mid = left + ((right - left)>>1);if(array[left] < array[right]){if(array[mid] < array[left])return left;if(array[mid] > array[right])return right;elsereturn mid;}else{if(array[mid] < array[right])return right;else if(array[mid] > array[left])return left;elsereturn mid;} }int partion(int array[], int left, int right) {int begin = left;int end = right-1;//三個數取中間int keyIndex = GetKeyIndex(array, left, right);if(keyIndex != right){std::swap(array[keyIndex], array[right]);}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;while( begin < end && array[end] > key)end--;if(begin < end){std::swap(array[begin], array[end]);begin++;}}if(begin != right && array[begin] > array [right]){swap(array[begin], array [right]);return begin;}return right; }void QuickSort(int array[], int left, int right) {if(left < right){int div = partion(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);} }/*int partion2(int array[], int left, int right) {int begin = left;int end = right;三個數取中間//int keyIndex = GetKeyIndex(array, left, right);//if(keyIndex != right)//{// std::swap(array[keyIndex], right);//}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;std::swap(array[begin], array[end]);while( begin < end && array[end] > key)end--;std::swap(array[begin], array[end]);}return begin; }void QuickSort(int array[], int left, int right) {if(left < right){int div = partion2(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);} }int partion3(int array[], int left, int right) {int begin = left;int end = right;int key = array[left];while( begin < end ){while( begin < end && array[end] >= key)end--;if(begin < end){array[begin] = array[end];begin++;}while( begin < end && array[begin] <= key)begin++;if(begin < end){array[end] = array[begin];end--;}}array[begin] = key;return begin; }void QuickSort(int array[], int left, int right) {if(left < right){int div = partion3(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);} }int partion4(int array[], int left, int right) {int Cur = left;int Prev = Cur - 1;int key = array[right];while(Cur <= right){if(array[Cur] < key && ++Prev != Cur)std::swap(array[Prev], array[Cur]);++Cur;}std::swap(array[++Prev], array[right]);return Prev; }void QuickSort(int array[], int left, int right) {if(left < right){int div = partion4(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);} }void QuickSort_nor(int *array, int size) {stack<int> s;s.push(size-1);s.push(0);while(!s.empty()){int left = s.top();s.pop();int right = s.top();s.pop();if(left < right){int div = partion3(array, left, right);s.push(right);s.push(div +1);s.push(div -1);s.push(left);}} } */

總結

以上是生活随笔為你收集整理的数据结构:排序算法之交换排序(冒泡排序、快速排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。