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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 快速排序(详解)

發(fā)布時(shí)間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 快速排序(详解) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 快速排序

1:快速排序的思想

? ? 快速排序運(yùn)用了分治的思想,即通過(guò)一趟排序 將序列分為兩部分,根據(jù)選取的基準(zhǔn),?將比基準(zhǔn)小的數(shù)放在基準(zhǔn)前面,將比基準(zhǔn)大的數(shù)放在的數(shù)放在基準(zhǔn)后面;然后對(duì)兩部分進(jìn)行遞歸處理,以達(dá)到整個(gè)序列有序的狀態(tài)。

2:快速排序的步驟

? ?(1):選擇基準(zhǔn) 在一個(gè)待排序列中找一個(gè) 待排的數(shù)作為基準(zhǔn);

? ?(2):分割操作 根據(jù)基準(zhǔn)將序列分為兩部分?

? ?(3):將分割后的序列進(jìn)行遞歸操作;

3:選擇基準(zhǔn)的方法

(1):固定基準(zhǔn):即選取序列的第一個(gè)數(shù)或最后一個(gè)數(shù)作為基準(zhǔn);(耗費(fèi)時(shí)間長(zhǎng))

(2):三數(shù)取中:即將序列中的首 中 尾 三個(gè)數(shù) 取出來(lái) 進(jìn)行比較取 中間那個(gè)數(shù);

4:運(yùn)算最快的代碼組合之一

? ? 三數(shù)取中 + 插排?

#include<stdio.h>void swap(int a, int b){int temp;temp = a;a = b;b = temp; }//插入排序 void Insertion_sort(int A[], int low, int high){int P,i; int N = high - low;for(P = 1; P < N; P++){int temp = A[P];for(i = P; i > 0 && A[i-1] >= temp; i--){A[i] = A[i-1];A[i-1] = temp; }} } //選取 一個(gè)基準(zhǔn) 進(jìn)行 分成兩部分 //使用三數(shù)取中法選擇樞軸 //int getstandard(int A[], int i, int j){ // // int mid = i + ((j - i) >> 1);//計(jì)算數(shù)組中間的元素的下標(biāo) // // //使用三數(shù)取中法選擇樞軸 // if (A[mid] > A[j])//目標(biāo): arr[mid] <= arr[high] // { // swap(A[mid],A[j]); // } // if (A[i] > A[j])//目標(biāo): arr[low] <= arr[high] // { // swap(A[i],A[j]); // } // if (A[j] > A[i]) //目標(biāo): arr[low] >= arr[mid] // { // swap(A[mid],A[i]); // } // //此時(shí),arr[mid] <= arr[low] <= arr[high] // int key = A[i]; // //low的位置上保存這三個(gè)位置中間的值 // //分割時(shí)可以直接使用low位置的元素作為樞軸,而不用改變分割函數(shù)了 // // while(i < j){ // // while(i < j && A[j] >= key){ // j--; // } // if(i < j && A[j] < key){ // A[i] = A[j]; // } // // while(i < j && A[i] <= key){ // i++; // } // if(i < j && A[i] > key){ //前面的數(shù)如果大于key的話(huà) 就將前面的數(shù)放到后面? // A[j] = A[i]; // } // } // //出這個(gè)循環(huán) // A[i] = key; // return i ; //}//此為選取第一個(gè) 數(shù)據(jù)作為基準(zhǔn) int getstandard(int A[], int left, int right){int i = left,j = right;int key = A[left];//選取 第一個(gè)數(shù)據(jù)為基準(zhǔn)while(i < j){while(i < j && A[j] >= key){j--;} while(i < j && A[i] <= key){i++;}//當(dāng)發(fā)現(xiàn) 從右邊開(kāi)始發(fā)現(xiàn)有比基準(zhǔn)數(shù)小的時(shí)候,從左邊開(kāi)始 遇到比基準(zhǔn)數(shù)大的時(shí)候//交換兩個(gè)數(shù) if(i < j){swap(A[i],A[j]);}} //出這個(gè)循環(huán) 交換基準(zhǔn)數(shù) 和 i 與 j 相等時(shí)那個(gè)位置的數(shù) A[left] = A[i];A[i] = key;return i; }void QuickSort(int A[] ,int low ,int high){if(low < high){int standard = getstandard(A, low, high);//遞歸兩部分 QuickSort(A, low, standard-1);QuickSort(A, standard+1, high); }//當(dāng)數(shù)據(jù)小于10的時(shí)候選擇插入排序明顯 比 快排速度更快 if(high - low < 10)Insertion_sort(A, low, high); } int main(){int i,n;scanf("%d",&n);int a[n];for(i=0; i<n; i++){scanf("%d",&a[i]);}QuickSort(a,0,n-1);for(i=0; i<n; i++){printf("%d ",a[i]);} }

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的数据结构 快速排序(详解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。