数据结构-挖坑填数+分治法解决快速排序问题(java+c)
文章目錄
- 一、定義
- 1.分治法
- 2.挖坑填數
- 3.快速排序思想
- 二、代碼實例
- 1.Java
- 2.c語言
看到網上有很多的講解,決定自己整理一遍
首先上定義
一、定義
1.分治法
分治算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。即一種分目標完成程序算法
簡單的說就是,大的問題劃分成一塊一塊的幾個小問題,把小的問題解決了合并起來就是原問題的解
有人會問,遞歸和分治一樣嗎?其實他們是有區別的,遞歸是自己調用自己而分治是上面說的那樣,因為遞歸和分治經常要一起用到,所以有些人誤解遞歸和分治是一樣的
2.挖坑填數
推薦:https://blog.csdn.net/MoreWindows/article/details/6684558?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
3.快速排序思想
快速排序(quick sort)是由冒泡排序改進而得的,他的基本思想是在待排序的n個元素中任意取一個元素(通常取第一個元素)作為基準,把該元素放入適當位置后,數據序列被此元素劃分為兩部分。
所有關鍵字比該元素關鍵字小的元素放置在前一部分,所有比它大的元素放置在后一部分,并把該元素排在這兩部分的中間(成為元素歸位),這個過程稱為一趟快速排序,即一趟劃分。
之后對產生的兩個部分分別重復上述過程,直至每部分內只有一個元素或空為止
通俗易懂:
1.從數列中取出一個數作為基準數(第一個數)
2.將比這個數大的數全放到它的右邊,小于或等于它的數全放到它的左邊 或者說,將大于等于這個數的放到它的右邊,小于它的數全放到它的左邊
3.再對左右區間重復第二步,直到各區間只有一個數或空為止
二、代碼實例
1.Java
//java代碼1: public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出遞歸的條件,每次遍歷當左邊等于右邊的時候退出,即i==j,i==j的位置就是當前輪基元素的位置int i = left,j = right, base = array[left];//設定基準為base , left == 0while(i<j) {//從兩邊遍歷到中間,直到i=j位置,這一行和if(left<right){}一樣,只不過是用i替換了left,用j替換了rightwhile(i<j && array[j]>=base)//如果遍歷的元素比base大就繼續找,j--,找到為止,或者到i==j為止j--;array[i] = array[j];//如果找到比base小的元素,就把j位置的值賦給i,j變成了一個坑,即比基元素小的到了基元素的前面while(i<j && array[i]<=base)//從左向右找,如果遍歷的元素比base小就繼續找,i++i++;}array[i] = base;//第一輪完事之后,i==j將基元素的位置重新確定,講整個序列分為兩個區間sort(array,left,i-1);//遍歷左區間sort(array,i+1,right);//遍歷右區間}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}} //java代碼2: public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出遞歸的條件int i = left,j = right, base = array[left];//設定基準為basewhile(i<j) {//從兩邊遍歷到中間,直到i=j位置while(i<j && array[j]>base)//從右向左找,如果遍歷的元素比base大就繼續找,j--j--;if(i<j){//必不可少array[i] = array[j];//如果找到比base小的元素,就把j位置的值賦給i,j變成了一個坑,即比基元素小的到了基元素的前面i++;//轉換到從左向右找,不用找相等的元素了}while(i<j && array[i]<base)//從左向右找,如果遍歷的元素比base小就繼續找,i++i++;if(i<j){array[j] = array[i];//如果找到比base大的元素,就把i位置的值賦給j,i變成了一個坑,上一個坑j被填滿了,即比基元素大的到了基元素的后面j--;//轉換到從右向左找,不用找相等的元素了}}array[i] = base;//第一輪完事之后,i==j將基元素的位置重新確定,講整個序列分為兩個區間sort(array,left,i-1);//遍歷左區間sort(array,i+1,right);//遍歷右區間}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}}運行結果:4 5 6 7 8 9
2.c語言
//c語言代碼1 #include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;array[i] = array[j];while(i<j && array[i]<=base)i++;array[j] = array[i];array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);} }void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);} } //c語言代碼2 #include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;if(i<j) {array[i] = array[j];i++;}while(i<j && array[i]<=base)i++;if(i<j) {array[j] = array[j];j--;}array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);} }void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);} }運行結果:4 5 6 7 8 9
總結
以上是生活随笔為你收集整理的数据结构-挖坑填数+分治法解决快速排序问题(java+c)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 学习网站,好不好自己看就完事了
- 下一篇: 数据结构-简单选择排序(C语言)